反射-小记

2017-10-09  本文已影响0人  我只是旁白

反射

一,反射机制的定义

指的是可以于运行时加载,探知和使用编译期间完全未知的类.

1,程序在运行状态中, 可以动态加载一个只有名称的类, 对于任意一个已经加载的类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能调用他的任意一个方法和属性;

2,加载完类之后, 在堆内存中会产生一个Class类型的对象(一个类只有一个Class对象), 这个对象包含了完整的类的结构信息,而且这个Class对象就像一面镜子,透过这个镜子看到类的结构,所以被称之为:反射。

二,反射有哪些优点与缺点

优点:1,可以降低类与类之间的关系 2,将编译时的检查延迟到运行时

缺点:1,性能效率不高,代码的可维护性差

三,如何使用反射

1,获取反射入口类的三种方式

①,对象的getClass()方法;

Class class1=Object.getClass();

②,类的.class(最安全/性能最好)属性;

Object obj=new Object();

Class class2=obj.class;

③,运用Class.forName(String className)动态加载类,className需要是类的全限定名(最常用).

 Class class3=Class.forname(路径);

2,获取成员变量
以上面获取反射的第三种方式为例
①,获取本类所有的成员变量(任意限制)

 1,无参,获取的返回类型为Field数组
 Field[] fields=class3.getDeclaredFields();
 2,有参,获取的返回类型为Field
 Field field=class3.getDeclaredField(变量名);

②,获取本类以及父类的public 修饰的成员变量

 1,无参,获取的返回类型为Field数组
 Field[] fields=class3.getFields();、
 2,有参,获取的返回类型为Field
 Field field=class3.getField(变量名);

3,获取构造方法

①,获取本类所有的构造方法(任意限制)

 1,无参,获取的返回类型为Constructor数组
 Constructor[] constructors=class3.getDeclaredConstructors();
 2,有参,获取的返回类型为Constructor
 Constructor constructor=class3.getDeclaredConstructor(类型.class);

②,获取本类以及父类的public 修饰的构造方法

  1,无参,获取的返回类型为Constructor数组
 Constructor[] constructors=class3.getConstructors();
 2,有参,获取的返回类型为Constructor
 Constructor constructor=class3.getConstructor(类型.class);

4,获取成员方法
①,获取本类所有的成员方法(任意限制)

 1,无参,获取的返回类型为Method数组
 Method[] methods=class3.getDeclaredMethods();
 2,有参,获取的返回类型为Method
 Method method=class3.getDeclaredMethod(类型.class);

②,获取本类以及父类的public 修饰的成员方法

  1,无参,获取的返回类型为Method数组
 Method[] methods=class3.getMethods();
 2,有参,获取的返回类型为Method
 Method method=class3.getMethod(类型.class);

5,以反射的形式创建对象

可以通过构造方法来实例化对象 .newInstance(有参构造传值,无参构造空着即可)

1,属性值的修改

①,获取所需修改变量,同上
②,设置访问权限
field.setAccessible(true);
③,修改属性值
field.set(.newInstance,"内容 ")\

2,方法的调用

①,获取所要调用方法,同上
②,设置访问权限
method.setAccessible(true);
③,调用方法
method.invoke(.newInstance);
上一篇 下一篇

猜你喜欢

热点阅读