声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223

反射四 利用反射获取类的属性

1.通过反射也可以获取到类中的属性,假设我们继续使用Person这个类,然后设置部分属性,公有属性,私有属性,静态属性

package study.reflect;

import java.io.InputStream;

import java.util.List;

public class Person

{

    /**

     * 为了测试用

     */

    public String name = "test";

    private int age = 1;

    public static int password = 12345;

    public Person()

    {

    }

    public Person(String name)

    {

       System.out.println("name:"+name);

    }

    public Person(String name,int age)

    {

       System.out.println("name:"+name+",age:"+age);

    }

    private Person(List list)

    {

       System.out.println("list");

    }

    public void sayHello()

    {

       System.out.println("hello");

    }

    public void sayHello(String name)

    {

       System.out.println("hello,"+name);

    }

    public String sayHello(String name,int age)

    {

       System.out.println("hello,"+name+",age:"+age);

       return name;

    }

    private void sayHello(InputStream in)

    {

       System.out.println("inputStream");

    }

    public static void sayHello(Person person)

    {

       System.out.println(person);

    }

    public static void main(String[] args) {

       System.out.println("main");

    }

}

2.然后通过反射获取属性

package study.reflect;

import java.lang.reflect.Field;

import org.junit.Test;

public class Demo04

{

    @Test

    public void test01() throws Exception

    {

       Class<?> clazz = Class.forName("study.reflect.Person");

       Person person = (Person) clazz.newInstance();

       Field field = clazz.getField("name");

       Object object = field.get(person);

       if(field.getType().equals(String.class))

       {

           System.out.println((String)object);

       }

    }

    @Test

    public void test02() throws Exception

    {

       Class<?> clazz = Class.forName("study.reflect.Person");

       Person person = (Person) clazz.newInstance();

       Field field = clazz.getDeclaredField("age");

       field.setAccessible(true);

       Object object = field.get(person);

       System.out.println(object);

    }

    @Test

    public void test03() throws Exception

    {

       Class<?> clazz = Class.forName("study.reflect.Person");

       //Person person = (Person) clazz.newInstance();

       Field field = clazz.getField("password");

       Object object = field.get(null);

       System.out.println(object);

    }

}

结果如下:

test

1

12345

3.前面我们学习了获取类的属性,方法,构造对象,那么我们现在模拟下java的内省操作,如下:

思路:定义一个Model类,里面所有的属性都是private的,然后为每个属性提供getter和setter方法;

再准备一个Map,map的key值都是类里面的属性字段的字符串表示,值任意。

设计一个方法ObjectgetModel(Mapmap,Classcls),传入一个包含所有值的Map,然后再传入Model类的class,那么返回Model类的实例,这个实例里面已经包含好了所有相关的数据。也就是把Map中的数据通过反射,设置回到Model类实例中。

代码:

import java.lang.reflect.Field; 

import java.lang.reflect.Method; 

import java.util.Map; 

public class MyBeanUtils { 

    public static Object populate(Class cls,Map<String, Object> map) throws ReflectiveOperationException, IllegalAccessException{ 

        Object obj=null; 

        //1 用类反射new出对象 

        obj=cls.newInstance(); 

        //2 再用类反射对新new的对象设置属性值(必须遵守Java设置规范)--即通过setter方法设置 

           //2.1遍历出所有该类声明的属性 

        Field flds[]=cls.getDeclaredFields(); 

        for(Field fld:flds){ 

            //获取该fld对象所代表的属性名 

            String fldName=fld.getName(); 

             //根据属性名,到map中去读取数据,只有数据非空才需要给该属性设置值  

            Object value=map.get(fld.getName());//返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。 

            if(value==null){ 

                System.out.println(fld.getName()+"的数据为空"); 

            }else{ 

                //如果map中存在对应的属性数据,则由属性名得出它的setter方法的名字 

                String methodName="set"+fldName.substring(0,1).toUpperCase()+fldName.substring(1); 

                 //根据方法名和参数的数据类型(其实就是属性的类型),获得Method对象 

                Method method=cls.getDeclaredMethod(methodName, fld.getType()); 

                 //调用该method对象所代表的方法 

                Object params[]=new Object[1]; 

                params[0]=value; 

                method.invoke(obj, params); 

            } 

        } 

        return obj; 

    } 

    public static<T>  T populate2(Class<T> cls,Map<String, Object> map) throws ReflectiveOperationException, IllegalAccessException{ 

        T obj=null; 

        //1 用类反射new出对象 

        obj=cls.newInstance(); 

        //2 再用类反射对新new的对象设置属性值(必须遵守Java设置规范)--即通过setter方法设置 

           //2.1遍历出所有该类声明的属性 

        Field flds[]=cls.getDeclaredFields(); 

        for(Field fld:flds){ 

            //获取该fld对象所代表的属性名 

            String fldName=fld.getName(); 

             //根据属性名,到map中去读取数据,只有数据非空才需要给该属性设置值  

            Object value=map.get(fld.getName());//返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。 

            if(value==null){ 

                System.out.println(fld.getName()+"的数据为空"); 

            }else{ 

                //如果map中存在对应的属性数据,则由属性名得出它的setter方法的名字 

                String methodName="set"+fldName.substring(0,1).toUpperCase()+fldName.substring(1); 

                 //根据方法名和参数的数据类型(其实就是属性的类型),获得Method对象 

                Method method=cls.getDeclaredMethod(methodName, fld.getType()); 

                 //调用该method对象所代表的方法 

                Object params[]=new Object[1]; 

                params[0]=value; 

                method.invoke(obj, params); 

            } 

        } 

        return obj; 

    } 

}  

JAVA中反射机制四的更多相关文章

  1. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  2. JAVA中反射机制一

    反射一 基本概念 一.反射机制的基本概念 什么是反射?反射是指在运行状态中,对于任意一个类,都可以获取到这个类的所有属性和方法:对于任意一个对象,都能够调用这个对象的任意方法和属性:这种动态获取信息及 ...

  3. Java中反射机制详解

    序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射, ...

  4. JAVA中反射机制五(java.lang.reflect包)

    一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...

  5. JAVA中反射机制六(java.lang.reflect包)

    一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...

  6. JAVA中反射机制三

    声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射三 利用反射获取对象的方法,并调用方法 1.利用反射获取对象的方法,我们仍然利用上面的Person类, ...

  7. JAVA中反射机制五(JavaBean的内省与BeanUtils库)

    内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法 ...

  8. JAVA中反射机制二

    声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射二 利用反射创建对象 1.利用反射创建对象,首先我们创建一个类,类里面,我们知道构造函数有默认的构造函 ...

  9. java中反射机制通过字节码文件对象获取字段和函数的方法

    pclass = Class.forName("get_class_method.Person"); //Field ageField = pclass.getField(&quo ...

随机推荐

  1. gitLab服务器搭建+ rundeck自动化部署

    git服务器搭建 https://blog.csdn.net/gx_1_11_real/article/details/79406427 rundeck   部署 https://blog.csdn. ...

  2. TCP系列45—拥塞控制—8、SACK关闭的拥塞撤销与虚假快速重传

    一.概述 这篇文章介绍一下TCP从Recovery状态恢复到Open状态的时候cwnd的更新.我们在tcp重传部分的文章中曾经介绍过虚假重传的概念,Linux在探测到虚假重传的时候就会执行拥塞撤销操作 ...

  3. B-2阶段组员分数分配

    组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块 武 武 武 武 杨 宫 宫 杨 宫 谢 李 杨 李 谢 李 谢 李 谢 杨 宫 扬 谢 宫 李 武 评 ...

  4. 使用ASP.NET Identity 实现WebAPI接口的Oauth身份验证

    使用ASP.NET Identity 实现WebAPI接口的Oauth身份验证   目前WEB 前后端分离的开发模式比较流行,之前做过的几个小项目也都是前后分离的模式,后端使用asp.net weba ...

  5. 【数据库】SQL两表之间:根据一个表的字段更新另一个表的字段

    1. 写法轻松,更新效率高:update table1 set field1=table2.field1,field2=table2.field2from table2where table1.id= ...

  6. 笔记-自己看Day20-待续

    1. 搭建环境 1)注释掉csrf 2)配置模板路径 'DIRS': [os.path.join(BASE_DIR,'templates')],  # BASE_DIR,代指当前目录. 3)配置静态文 ...

  7. 【比赛】HNOI2018 寻宝游戏

    考试的时候就拿了30points滚粗了 听说myy对这题的倒推做法很无奈,官方题解在此 正解思路真的很巧妙,也说的很清楚了 就是分别考虑每一位,会发现题解中的那个性质,然后把询问的二进制数按照排序后的 ...

  8. Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model)

    关于光照模型 所谓模型,一般是由学术算法发起, 经过大量实际数据验证而成的可靠公式 现在还记得2009年做TD-SCDMA移动通信算法的时候,曾经看过自由空间传播模型(Free space propa ...

  9. NOIP2003 传染病控制 【搜索 + 卡时】

    题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...

  10. CODECHEF Chef and Churus 解题报告

    [CODECHEF]Chef and Churus Description 有一个长度为\(n\)的数组\(A\),有\(n\)个函数,第\(i\)个函数的值为\(\sum_{j=l_i}^{r_i} ...