Java反射机制
作者:互联网
概述
反射机制是指在运行状态中能获取任意一个类的属性和方法,能调用任意一个对象的方法和属性。
能动态获取对象信息以及调用对象方法的功能为java的反射机制
获取Class对象的四种方式
要动态的获取这些信息需要Class
对象,通过该对象可以将一个类的方法、变量信息告诉程序。
有四种方式获取Class
对象
- 知道具体类
Class alunbarClass = TargetObject.class;
Class.forName()
传入类路径
Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");
Class.forName(className)方法,内部实际调用的是一个native方法 forName0(className, true, ClassLoader.getClassLoader(caller), caller);
第2个boolean参数表示类是否需要初始化,Class.forName(className)默认是需要初始化。
一旦初始化,就会触发目标对象的 static块代码执行,static参数也会被再次初始化。
- 通过对象实例
instance.getClass()
获取
Employee e = new Employee();
Class alunbarClass2 = e.getClass();
- 通过类加载器
xxxClassLoader.loadClass()
传入类获取路径
class clazz = ClassLoader.LoadClass("cn.javaguide.TargetObject");
通过类加载器获取Class
对象不会进行初始化,意味着不进行包括初始化等一些列步骤,静态块和静态对象不会得到执行。
代码测试
- 要使用反射操作的类
package cn.javaguide;
public class TargetObject {
private String value;
public TargetObject() {
value = "JavaGuide";
}
public void publicMethod(String s) {
System.out.println("I love " + s);
}
private void privateMethod() {
System.out.println("value is " + value);
}
}
- 使用反射操作这个类的方法和参数
package cn.javaguide;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {
/**
* 获取TargetObject类的Class对象并且创建TargetObject类实例
*/
Class<?> tagetClass = Class.forName("cn.javaguide.TargetObject");
TargetObject targetObject = (TargetObject) tagetClass.newInstance();
/**
* 获取所有类中所有定义的方法
*/
Method[] methods = tagetClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
/**
* 获取指定方法并调用
*/
Method publicMethod = tagetClass.getDeclaredMethod("publicMethod",
String.class);
publicMethod.invoke(targetObject, "JavaGuide");
/**
* 获取指定参数并对参数进行修改
*/
Field field = tagetClass.getDeclaredField("value");
//为了对类中的参数进行修改我们取消安全检查
field.setAccessible(true);
field.set(targetObject, "JavaGuide");
/**
* 调用 private 方法
*/
Method privateMethod = tagetClass.getDeclaredMethod("privateMethod");
//为了调用private方法我们取消安全检查
privateMethod.setAccessible(true);
privateMethod.invoke(targetObject);
}
}
调用私有方法属性时需要使用xxx.setAccessible(true); 取消安全检查
静态编译与动态编译
- 静态编译: 编译时确定类型绑定对象
- 动态编译:运行时确定类型绑定对象
反射机制优缺点
- 优点: 运行期类型判断,动态加载类,提高代码灵活度
- 缺点:1.性能瓶颈,相当于解释操作通知jvm做事,2.安全问题,动态操作增加了安全隐患
应用场景
- 框架设计
- 模块开发
- 动态代理
标签:反射,Java,初始化,对象,获取,tagetClass,机制,Class,TargetObject 来源: https://blog.csdn.net/renweiyi1487/article/details/110089783