Java反射机制个人小总结

1、概念
     Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
2、Java反射机制提供的功能
(1)在运行期间,判断任意一个对象所属的类。
(2)在运行期间,构造任意类的对象。
(3)在运行期间,判断任意类所具有的属性和方法。
(4)在运行期间,调用任意类的成员变量和方法。
3、Class类
在Object类中定义了一个方法,此方法将被所有的子类继承。
Public final Class getClass(){}
此方法的返回值是Class类型,此类是java反射的源头,实际上从运行结果来看,所谓的反射就是通过对象反射求出类的名称。
正常的引入过程:包类名称——new实例化——取得实例化对象
反射方式:实例化对象——getClass方法——得到完整的包类名称
Class对象:要想操纵类中的属性和方法。都必须从获取Class对象开始。Class类没有公共的构造方法。Class对象是在加载类时由jvm以及通过调用类加载器中的方法自动构造的。
4、获取Class对象。
(1)object.getClass() 获取指定实例的Class
(2)class.getSuperclass() 获取当前class对象的父类
(3)通过类名.class 方法。所有的类都有cl[size=large]
ass静态属性。
(4)Class.forName(String 全类名)全类名:包名加类名 这种方法是最为常用的。全类名后面不加.class
5、包装类名.Type 表示获取它所包装类的class实例
Integer.Type 获取的是int的class实例,效果等同于int.class
Integer.class 获取
6、获取了Class对象之后,如何去创建Class对象所代表的类的实例:
第一种:通过获取的class对象classType.newInstance()方法。调用默认的无参的构造方法。如果这个时候类中没有无参的构造方法的话,就会报异常。
第二种:
获取指定的构造方法(按照参数列表区分哪个构造方法):首先通过Class类中的getConstructors()方法返回一个Constructor类类型的数组,用于查看类中所有的构造方法。
如果想要获取指定参数的构造方法的话需要调用Class类中的getConstructor(new Class[]{数据类型的类})方法获取某一个构造方法的对象,注意:数据类型的类是指:如String.class这样的格式,而且可以是多个,因其本身就是一个可变数组。然后在调用Constructor类中的newInstance(new Object[]{具体类型的值})就可以了。当然,通过这个方法可以获取无参的构造函数,但是不需要,因为在Class类中就有获取无参的构造函数的方法。
7、如何通过反射获取类中的方法
(1)获取当前类及其父类所有的public方法
Method [] methods=classType.getMethods();
(2)获取当前类申明的所有Method
Method [] methods=classType.getDeclaredMethods();
(3)获取当前类以及超类指定的public Method
Method method=classType.getMethod(String name(方法名),Class<?>...parameterType(参数列表))
(4)获取当前类申明的指定的方法(包括私有的)
Method method=classType.getDeclaredMethod(String name(方法名),Class<?>...parameterType(参数列表)) 私有方法可以获取到,但是不能使用,除非是调用setAccessible方法取消访问检查,但是不建议,因为这样会破坏封装性。
8、如何通过反射机制调用获取到的方法
method.invoke(obj,new Object[]{"String",int}) obj是通过构造方法获得的某个当前类的对象。new Object[]{"String",int}是指方法所需要的参数列表。
Invoke()方法的返回值是Object类型,用于去接收这个方法可能需要返回的值。
9、如何通过反射机制获取类的属性。
(1)获取当前类及其父类的所有的public属性
Field [] fields=classType.getFields();
(2)获取当前类申明的所有属性
Field [] fields=classType.getDeclaredFields();
(3)获取当前类及其父类指定的public属性
Field field=classType.getFiled(String name);
(4)获取当前类申明的指定的属性(可以是私有的)
Field field=classType.getDeclaredField(String name);
10、如何使用通过反射机制获取到的属性
field.set(Object obj,Object value); obj是指的具体的实例。value是要设定的值。
Object obj=field.get(Object obj);获取此对象上该字段的值。[/size]

猜你喜欢

转载自fengwuhen1990.iteye.com/blog/2341914
今日推荐