Java 反射
2016-05-03 20:27
309 查看
反射:通过全类名获取该类的对象
Class是一个描述类的类,在该类中封装了描述方法的Method,描述字段的Field,描述构造器的Constructor等属性。
jvm在加载类时会为每一个类创建唯一的一个Class对象,这个Class对象保存了对应的类的基本信息,比如属性、方法等
获取该类对应的Class对象的三种方法(假设该类为Person):
1、通过类直接获取
Class clazz = Person.class;
2、通过实例的getClass()方法获取
Person person = new Person();
Class clazz = person.getClass();
3、通过全类名获取
Class clazz = Class.forNanme("要获取的类的全类名");
获取Class对象后
1、可以创建类的对象
Person person = clazz.newInstance()
2、可以获取对象的方法和属性
1)Method[] method = clazz.getMethods()//获取该类中的public的所有方法,包括基类中的方法
1)Method[] method = clazz.getDeclaredMethods();//获取该类中声明的所有方法,包括private方法
2)Method method = clazz.getDeclaredMethod("方法名",参数对应的class对象)//只能获取该类自身声明的方法,不能获取基类中声明的方法
例如:clazz.getDeclaredMethod("setName",String.class)
通过Method对象执行方法
method.invoke(对象,参数)//method.invoke(person,name);
//若通过method的invoke调用方法时访问权限不足(比如是private方法时),应该在调用前使被调用的方法变为可访问的
method.setAccessible(true);
例如调用Person类的setName()方法
1、获取Class对象
Class clazz = Class.forName("全类名");
2、创建类的实例
Object object = clazz.newInstance();
3、获取Method对象
Method method = clazz.getDeclaredMethod("setName",String.class);
4、调用方法
String name = "Dunk";
method.invoke(object,name);
如果要获取基类中的私有方法,则需要先获取基类Class对象
Class clazz1 = clazz.getSuperClass()//获取基类Class对象
接下来的就是获取method对象。。。
参考:http://azrael6619.iteye.com/blog/429797
Class是一个描述类的类,在该类中封装了描述方法的Method,描述字段的Field,描述构造器的Constructor等属性。
jvm在加载类时会为每一个类创建唯一的一个Class对象,这个Class对象保存了对应的类的基本信息,比如属性、方法等
获取该类对应的Class对象的三种方法(假设该类为Person):
1、通过类直接获取
Class clazz = Person.class;
2、通过实例的getClass()方法获取
Person person = new Person();
Class clazz = person.getClass();
3、通过全类名获取
Class clazz = Class.forNanme("要获取的类的全类名");
获取Class对象后
1、可以创建类的对象
Person person = clazz.newInstance()
2、可以获取对象的方法和属性
1)Method[] method = clazz.getMethods()//获取该类中的public的所有方法,包括基类中的方法
1)Method[] method = clazz.getDeclaredMethods();//获取该类中声明的所有方法,包括private方法
2)Method method = clazz.getDeclaredMethod("方法名",参数对应的class对象)//只能获取该类自身声明的方法,不能获取基类中声明的方法
例如:clazz.getDeclaredMethod("setName",String.class)
通过Method对象执行方法
method.invoke(对象,参数)//method.invoke(person,name);
//若通过method的invoke调用方法时访问权限不足(比如是private方法时),应该在调用前使被调用的方法变为可访问的
method.setAccessible(true);
例如调用Person类的setName()方法
1、获取Class对象
Class clazz = Class.forName("全类名");
2、创建类的实例
Object object = clazz.newInstance();
3、获取Method对象
Method method = clazz.getDeclaredMethod("setName",String.class);
4、调用方法
String name = "Dunk";
method.invoke(object,name);
如果要获取基类中的私有方法,则需要先获取基类Class对象
Class clazz1 = clazz.getSuperClass()//获取基类Class对象
接下来的就是获取method对象。。。
参考:http://azrael6619.iteye.com/blog/429797
相关文章推荐
- Java 泛型extends和super
- java 静态代理和动态代理
- java中创建线程的的方法
- java学习笔记之动态代理
- 使用Eclipse可以方便的统计工程或文件的代码行数,
- Spring中的@Transactional必须要了解的概念
- WebSocket不同版本的三种握手方式以及一个Netty实现JAVA类
- java笔记→递归算法、枚举法、辗转相除法
- JDK,cglib动态代理-AOP学习
- java 反射详解
- java nio io模型
- JAVA - 优雅的记录日志(log4j实战篇)
- 向JAVA项目中导入jar包,需要进行设置。(安卓项目可直接导入)
- [Java基础] Java四类八种基本类型
- 3Sum leetcode第15题 Java代码
- RxJava----操作符:辅助操作符
- java方法的声明及使用
- java学习之暴力求解新郎新娘的问题
- springcloud(第一篇)springcloud config 入门
- 《JAVA并发编程实战---读书笔记2》