一篇文章带你搞定JAVA反射
什么是反射
Java反射是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;在运行时可以获取类的信息,并且可以操作类,比如获取构造方法和成员变量、方法的信息,以及调用方法等。
反射的作用
Java反射机制在框架开发和调试中经常用到,可以动态的创建对象,动态的访问和修改对象属性,动态的修改方法、调用方法。
反射的基本用法
获取类的基本信息
获取一个类的Class对象,有三种方法:
方法1:使用Class.forName()方法
Class<?> clazz1 = Class.forName("com.yourpackage.YourClass");
方法2:直接获取类对象
YourClass yourClass = new YourClass();
Class<?> clazz2 = yourClass.getClass();
方法3:使用类.class方式
Class<?> clazz3 = YourClass.class;
获取类的成员变量
获取类的成员变量,可以使用如下方式:
// 获取字段
Field[] fields = clazz.getDeclaredFields();
获取类的构造方法
获取类的构造方法,可以使用如下方式:
// 获取构造方法
Constructor<?>[] constructors = clazz.getConstructors();
获取类的方法
获取类的方法,可以使用如下方式:
// 获取所有方法
Method[] methods = clazz.getDeclaredMethods();
// 获取单个方法
Method method = clazz.getDeclaredMethod("methodName", parameterTypes);
反射实例说明
示例1:动态调用类的方法
class Student{
private String name;
public void setName(String name) {
this.name = name;
}
public void showName() {
System.out.println("Name: " + this.name);
}
}
public class Test {
public static void main(String[] args) {
try {
//获取类的class对象
Class clazz = Class.forName("Student");
//实例化对象
Object obj = clazz.newInstance();
//获取方法
Method method = clazz.getDeclaredMethod("setName", String.class);
//调用方法
method.invoke(obj, "zhangsan");
//获取方法
method = clazz.getDeclaredMethod("showName");
//调用方法
method.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述代码通过反射机制动态调用类的方法,输出如下:
Name: zhangsan
示例2:反射创建对象
public class Test {
public static void main(String[] args) {
try {
//获取类的class对象
Class clazz = Class.forName("java.util.ArrayList");
//使用构造方法创建对象
Object obj = clazz.newInstance();
//向对象中添加元素
Method m1 = clazz.getMethod("add", Object.class);
m1.invoke(obj, "hello");
m1.invoke(obj, "world");
//打印对象中的元素
Method m2 = clazz.getMethod("toString");
System.out.println(m2.invoke(obj));
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述代码通过反射机制创建了一个ArrayList对象,并向其中添加元素,然后打印输出ArrayList中的元素,输出如下:
[hello, world]
反射的局限
反射机制虽然强大,但也有其局限性,它会严重影响程序执行效率,而且不够安全,需要额外增加代码实现安全性的保证。
参考资料
[1].Java反射机制详解
[2].Java反射机制的构造方法、成员变量、方法及属性等详细介绍
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一篇文章带你搞定JAVA反射 - Python技术站