Java 中的反射和 new 的区别是什么?(附示例代码)
在 Java 中,反射和 new
都可以用于创建对象,但它们的实现机制不同。具体区别如下:
new
关键字是在编译期确定的,它会在堆内存中为对象分配内存并进行初始化。而反射是在运行时动态地获取类信息并进行操作,它可以在程序运行期间加载、检查和修改类。- 使用
new
创建对象时,需要明确对象的类型,而使用反射创建对象时,可以在运行时动态地获取类的信息并创建对象,不需要在编译期间确定类的类型。
下面是一个示例代码,演示了通过 new
和反射分别创建对象的过程:
public class MyClass {
private int num;
private String str;
public MyClass(int num, String str) {
this.num = num;
this.str = str;
}
public void print() {
System.out.println("num: " + num + ", str: " + str);
}
}
public class Main {
public static void main(String[] args) throws Exception {
// 使用 new 创建对象
MyClass obj1 = new MyClass(1, "hello");
obj1.print();
// 使用反射创建对象
Class<MyClass> clazz = MyClass.class;
Constructor<MyClass> constructor = clazz.getConstructor(int.class, String.class);
MyClass obj2 = constructor.newInstance(2, "world");
obj2.print();
}
}
在上面的示例代码中,首先使用 new
关键字创建了一个 MyClass
的对象 obj1
,然后调用了 print
方法输出了对象的属性值。
接着,使用反射机制创建了一个 MyClass
的对象 obj2
,首先通过 MyClass.class
获取 MyClass
的 Class
对象,然后通过 getConstructor
方法获取指定的构造方法,并通过 newInstance
方法创建了一个新的对象。最后调用了 print
方法输出了对象的属性值。