JAVA中反射机制四
声明:如需转载请说明地址来源: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中反射机制四的更多相关文章
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- JAVA中反射机制一
反射一 基本概念 一.反射机制的基本概念 什么是反射?反射是指在运行状态中,对于任意一个类,都可以获取到这个类的所有属性和方法:对于任意一个对象,都能够调用这个对象的任意方法和属性:这种动态获取信息及 ...
- Java中反射机制详解
序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射, ...
- JAVA中反射机制五(java.lang.reflect包)
一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...
- JAVA中反射机制六(java.lang.reflect包)
一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...
- JAVA中反射机制三
声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射三 利用反射获取对象的方法,并调用方法 1.利用反射获取对象的方法,我们仍然利用上面的Person类, ...
- JAVA中反射机制五(JavaBean的内省与BeanUtils库)
内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法 ...
- JAVA中反射机制二
声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射二 利用反射创建对象 1.利用反射创建对象,首先我们创建一个类,类里面,我们知道构造函数有默认的构造函 ...
- java中反射机制通过字节码文件对象获取字段和函数的方法
pclass = Class.forName("get_class_method.Person"); //Field ageField = pclass.getField(&quo ...
随机推荐
- oracle和DB2的差异
1.简介 当今IT的环境正经历着剧烈的变化,依靠单一的关系型数据库管理系统(RDBMS)管理数据的公司开始逐渐减少.分析家的报告指出 ,今天超过90%的公司都拥有不只一种RDBMS.在现在紧张的经济情 ...
- PHP中普通属性和静态属性
普通属性(实例属性): 实例的单词为:instance 实例,其实也叫做“对象”: 普通(实例)属性,就是一个可以在该类实例化出的对象上使用的属性! 定义形式: class 类名{ var $属性 ...
- 博客搬家 --- CSDN
博客园好久没维护了,搬家吧 欢迎移步到新博客
- idea 复制数据库查询结果,粘贴直接生成insert into 语句
遇到一个场景,需要将数据库查询的结果导入到另外一个数据库中,给我的第一感受是,写程序,从数据库A中获取到数据,在插入到数据库B中. 但是Idea 可以直接复制查询结果,然后粘贴生成insert语句. ...
- SQL中的declare用法
平时写SQL查询.存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣. 大家都知道c#中的局 ...
- 记一次Spring配置事故
在引入Spring的Validated时,需要声明如下bean: @Beanpublic MethodValidationPostProcessor methodValidationPostPro ...
- UVA10859 Placing Lampposts
我是题面 这道题使我知道了一种很神奇的方法,一定要认真看哦 如果没有被两盏灯同时照亮的边数应尽量大这个限制的话,这就是一道很经典的树形DP题--没有上司的舞会 很可惜,这个限制就在那里,它使得我辛苦写 ...
- 802.1p 优先级与内部优先级的映射关系
缺省情况下,所有华为 S 系列交换机的 802.1P 优先级 与内部优先级的映射关系是 一 样的,如表 10-3 所示.从中可以看出,这些交换机中 802.1p 优先级与内部优先级的缺省映射关系是按等 ...
- 【刷题】BZOJ 4025 二分图
Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. Input ...
- 常州day5
Task 1 小 W 和小 M 一起玩拼图游戏啦~ 小 M 给小 M 一张 N 个点的图,有 M 条可选无向边,每条边有一个甜蜜值,小 W 要选 K条边,使得任意两点间最多有一条路径,并且选择的 K条 ...