Java 反射

 

 

 

 

 反射=反向射击=Java向自己射击=Java对自身进行描述=Java用研究外部事物的方法反过来研究自己

——反射的好处:

1. 可以在程序运行过程中,操作这些对象。

2. 可以解耦,提高程序的可扩展性。

——获取Class对象的方式:

1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象

***多用于配置文件,将类名定义在配置文件中,读取文件,加载类

2. 类名.class:通过类名的属性class获取

***多用于参数的传递

3. 对象.getClass():getClass()方法在Object类中定义着。

***多用于对象的获取字节码的方式

【结论】:

同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的class对象都是同一个,即单例模式。

 

 

 

——Class对象功能:

【获取功能】:

1. 获取成员变量们:

Field[] getFields():获取所有public修饰的成员变量

Field getField(String name):获取所有public修饰的指定名称的成员变量

Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符

Field getDeclaredField(String name)

2. 获取构造方法们:

Constructors<?>[] getConstructors()

Constructors<T>[] getConstructor(类<?>...parameterTypes)

Constructors<T>[] getDeclaredConstructor(类<?>...parameterTypes)

Constructors<?>[] getDeclaredConstructors()

3. 获取成员方法们:

Method[] getMethods()

Method getMethod(String name,类<?>...parameterTypes)

Method[] getDeclaredMethods()

Method getDeclaredMethod(String name,类<?>...parameterTypes)

4. 获取类名

String getName()

——Field:成员变量

【操作】:

1. 设置值

void set(Object obj, Object value)

2. 获取值

Object get(Object obj)

3. 忽略访问权限修饰符的安全检查:

obj.setAccessible(true):暴力反射,访问d

——Constructor:构造方法

【创建对象】:

Constructor c=目标类Class.getConstructor(目标类的属性)

Object obj=c.newInstance(Object ... args:目标类的属性实例)

如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance()方法

——Method:方法对象:

【执行方法】:

Object invoke(Object obj, Object... args)

【获取方法名称】:

String getName:获取方法名

posted @ 2022-11-23 20:57  yhstsy  阅读(24)  评论(0)    收藏  举报