老生常谈Java反射机制(必看篇)
什么是Java反射机制?
Java反射机制是Java提供的一种能够在运行时获取对象的信息以及修改对象的内容的方法。通过反射机制,程序可以获取任意一个类的内部信息,并且可以操作类、构造器、方法、成员变量等。
反射机制的应用场景
- 通过配置文件来读取实例化的对象
- 对框架类进行扩展
- 调试时查看对象的属性信息
反射机制的基本用法
获取Class对象
-
获取类对象的三种方法
-
通过对象的getClass()方法获取
- 通过类名.class获取
- 通过Class.forName()方法获取
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
User user = new User();
Class clz1 = user.getClass(); // 通过getClass()方法获取类值
Class clz2 = User.class; // 通过类名.class获取类值
Class clz3 = Class.forName("User"); // 通过Class.forName()获取类值
System.out.println(clz1 == clz2 && clz2 == clz3); // 输出true
}
}
获取类信息
- 获取类的构造方法
public class User {
public User(String name, int age) {
this.name = name;
this.age = age;
}
private String name;
private int age;
}
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
Class clz = Class.forName("User");
Constructor constructor = clz.getDeclaredConstructor(String.class, int.class);
System.out.println(constructor); // 输出:public User(java.lang.String,int)
}
}
- 获取类的成员变量信息
public class User {
private String name;
private int age;
}
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class clz = Class.forName("User");
Field[] fields = clz.getDeclaredFields();
for (Field f : fields) {
System.out.println(f.getName()); // 输出:name age
}
}
}
- 获取类的方法信息
public class User {
private String name;
public String getName() {
return name;
}
}
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
Class clz = Class.forName("User");
Method method = clz.getDeclaredMethod("getName", null);
System.out.println(method); // 输出:public java.lang.String User.getName()
}
}
- 修改类的私有成员变量值
public class User {
private String name;
}
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
Class clz = Class.forName("User");
Object obj = clz.newInstance();
Field field = clz.getDeclaredField("name");
field.setAccessible(true);
field.set(obj, "张三");
User user = (User) obj;
System.out.println(user.getName()); // 输出:张三
}
}
反射机制的注意事项
- 反射机制在运行时会降低性能,所以应该尽量减少使用
- 反射机制可以访问私有成员变量和方法,这可能会破坏类的封装性
- 通过反射机制修改成员变量、方法,会使得程序的可读性变差
总结
Java反射机制是Java编程中一个非常重要的特性,我们可以通过反射机制,动态的获取类信息并修改其内容,这给Java编程带来了无限的可能。但同时也要注意反射机制存在的缺陷,尽量减少使用,保证代码的可读性和性能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:老生常谈Java反射机制(必看篇) - Python技术站