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 ...
随机推荐
- FormsAuthentication.SetAuthCookie 方法登录
FormsAuthentication.SetAuthCookie 方法,登录的原理. FormsAuthentication.SetAuthCookie 方法登录的过期时间. 登录相关阅读 asp. ...
- PAT 甲级 1043 Is It a Binary Search Tree
https://pintia.cn/problem-sets/994805342720868352/problems/994805440976633856 A Binary Search Tree ( ...
- maven将依赖打入jar包
将 依赖打入jar包,由于maven管理了所有的依赖,所以将项目的代码和依赖打成一个包对它来说是顺理成章的功能.maven的这个功能之前就用过,但这 次使用时忘了细节,只记得用maven的assemb ...
- CentOS 7 U盘安装问题解决
最近期待以久的CentOS 7正式版终于发布了,在家里无聊,所以就打算在我的小Y上安装一下,由于笔记本原来有安装Windows 7 操作系统,考虑使用的需求,所以决定安装双系统: 1. ...
- Binlog的三种模式
binlog模式分三种(row,statement,mixed) 1.Row 日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改,只记录要修改的数据,只有value,不会有 ...
- Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
我在update数据库的时候出现的死锁 数据库表死锁 Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackExcept ...
- 使用ResourceBundle 类读取 src 下的 xxx.properties 文件
之前要读取 src 下的 .properties 文件都是使用的类加载器,加载类路径下的资源文件当做一个流来处理,load 到一个 Properties 对象上. jdbc.properties 代码 ...
- mybatis(一)MyBatis Generator
在gradle中使用MyBatis Generator时,build.gradle配置如下: dependencies { mybatisGenerator group: 'org.mybatis.g ...
- 第78天:jQuery事件总结(一)
jQuery事件总结(一) 现在就一点一点积累自己的知识体系,记录自己学到的和自己所理解的jQuery. JavaScript和HTML之间的交互式通过用户和浏览器操作页面时引发的事件机制来处理 ...
- AtCoder Regular Contest 083 D: Restoring Road Network
题意 有一张无向带权连通图(点数<=300),给出任意两点i,j之间的最短路长度dis[i][j].问是否存在一张这样的无向图.如果不存在输出-1.如果存在输出所有这样的无向图中边权和最小的一张 ...