Java反射--class类
Java反射是指在运行时动态地获取类的信息并操作对象的能力。Java中每个类都有一个对应的Class类型,可以通过该类型来访问和修改这个类。
使用Java反射需要先获得要操作的class对象,常见方式如下:
-
通过Object.getClass()方法获取实例所属于哪个Class
-
直接调用某一特定类.class或者ClassLoader.loadClass(String className)方法加载目标class文件生成相应 Class 对象
-
使用java.lang.Class.forName(String name, boolean initialize, ClassLoader loader)静态函数根据全限定名(包括包路径)返回与之关联 class 的引用,并且会初始化 static 块以及变量
例如:
// 获取String 类型
String str = "Hello World";
System.out.println(str.getClass());
// 加载Person 类
try {
Person person = (Person) Class.forName("com.example.Person").newInstance();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e){
e.printStackTrace();
}
除了上述基本功能外,还可利用 Java 反射机制完成以下任务:
- 在程序运行过程中构造任意一个类、执行其无参私有构造器创建新实例。
- 调整数组大小而不影响原始数据。
- 检查成员变量/属性值是否合法;
- 动态代理等。
具体来说,在Java语言里面所有被编译后产生 .class 文件格式描述符号均为 java.lang.Class 类型的实例。Java反射机制提供了以下方法来获取Class对象:
- Class.forName(String className):根据类名返回对应的Class对象,需要指定完整路径。
- obj.getClass():通过已有实例获得其所属类型信息
- T.class或者T.TYPE(其中T为任意数据类型): 直接使用某一特定类.class语法糖加载目标class文件生成相应 Class 对象
在拿到一个Class之后,我们可以利用它进行如下操作:
-
获取该类中所有构造函数、成员变量和方法等相关信息。
-
创建新的实例并调用其各种属性及行为;
-
修改私有字段值以及执行私有方法;
-
动态代理等高级功能。
总之,在适当情况下使用Java反射机制能够帮助开发人员更加灵活地处理程序运行时期间出现问题,并且扩展性也非常强大。但是由于其灵活性较高,在使用时需要注意安全问题,并且不要滥用以避免影响程序效率。
本文来自博客园,作者:两拳ko小yu,转载请注明原文链接:https://www.cnblogs.com/SwapEnd/p/17375800.html