Java中的反射机制:类加载、对象创建、方法调用
在Java中,反射机制指的是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;并且能够调用它们。这种动态获取类的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
在Java中,类加载指的是将一个类的.class文件中的类信息读入内存,并为之创建一个Class对象。也就是说,类加载是将类的.class文件中的二进制数据读入内存中,将其转换成方法区中的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象。
Java虚拟机规范没有规定Class对象内部结构以及数据的存储方式,这些由不同的虚拟机来实现。但不管怎么实现,都必须具备一个公共的访问接口,以便程序能够通过这个接口访问到这些数据。
在Java中,对象创建一般使用new关键字来完成。但是,通过反射机制同样可以创建对象。
Java中通过Class对象的newInstance()方法来创建对象,但前提是被创建的类必须有一个无参的构造方法。
Class clazz = Class.forName("com.example.Student");
Object obj = clazz.newInstance();
上面的代码创建了一个Student类的对象,其中clazz是一个Class对象,通过Class.forName()方法获取。在创建对象之前,需要先加载类,也就是获取该类的Class对象。
在Java中,方法调用一般使用.运算符来完成。但是,通过反射机制同样可以调用方法。
Java中通过Method类的invoke()方法来调用方法,但需要提供方法名和参数列表。
Class clazz = Class.forName("com.example.Student");
Object obj = clazz.newInstance();
Method method = clazz.getMethod("setName", String.class);
method.invoke(obj, "Tom");
上面的代码调用了Student类的setName()方法,其中clazz、obj是之前创建的,getMethod()方法传入方法名和参数类型,invoke()方法传入对象和参数值。
下面是一个使用反射机制创建对象并调用方法的示例代码:
import java.lang.reflect.Method;
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("com.example.Student");
Object obj = clazz.newInstance();
Method method = clazz.getMethod("setName", String.class);
method.invoke(obj, "Tom");
Method getNameMethod = clazz.getMethod("getName");
String name = (String) getNameMethod.invoke(obj);
System.out.println("Name: " + name);
}
}
class Student {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
该代码创建了一个Student类的对象,调用setName()方法设置name的值,并调用getName()方法获取name的值,最终输出结果。
本文为翻滚的胖子原创文章,转载无需和我联系,但请注明来自猿教程iskeys.com