JAVA_SE_笔记整理(反射机制)

反射机制

1、反射概述:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

获取Class对象的三种方式:

1、 Person p = new Person();

  Class c = p.getClass();

2、 Class c2 = Person.class; // 任意数据类型都具备一个class静态属性,看上去要比第一种方式简单.

3、 Class c3 = Class.forName("Person"); // 这里的字符串必须是类的全路径

// 将类名作为字符串传递给Class类中的静态方法forName即可

分析第三种和前两种的区别:
前两种你必须明确Person类型.

后者只需要知道类的字符串形式,扩展性更强。按照配置文件加载就可以了。

2、通过反射获取构造方法并使用

第一种方式获取对象:

Class——newInstance(); // 创建此 Class 对象所表示的类的一个新实例,该对象是通过无参构造new出来的。具有局限性,不能使用多参构造。

第二种方式获取对象:(可以通过有参构造进行new)

Constructor ——public T newInstance(Object ... initargs) // 创建带参构造所对应的对象

public Constructor<?>[] getConstructors() // 获取所有公共构造方法

public Constructor<?>[] getDeclaredConstructors() // 获取所有构造方法

public Constructor<T> getConstructor(Class<?>... parameterTypes) // 获取指定构造方法

参数为,构造方法的参数类型的class

public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) // 获取指定构造方法,(可以是任意权限的构造方法)

public void setAccessible(boolean flag) // 设置忽略权限,拿构造不需要忽略权限,但是使用构造需要忽略权限

3通过反射获取属性并使用

获取属性:

public Field[] getFields() // 获取所有公共属性(字段,成员变量)

public Field[] getDeclaredFields() // 获取所有的属性

public Field getField(String name) // 获取指定公共属性

public Field getDeclaredField(String name) // 获取指定属性名称的属性对象

使用属性:

Field ——public void set(Object obj, Object value) // 给对象设置值

第一个参数:对象,第二个参数是值。

4、通过反射获取方法使用

获取方法:

getMethods 获取所有公共方法 包含继承的方法

getDeclaredMethods 获取所有方法 不包含继承的方法

getMethod 获取指定公共方法

getDeclaredMethod 获取指定方法

强制访问,私有方法method.setAccessible(true);

使用方法:

invoke(Object obj, Object... args)

猜你喜欢

转载自www.cnblogs.com/songliuzhan/p/12624156.html