使用反射机制实例化一个对象时,有以下注意的地方
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
class Test {
private String name;
public Test() {
System.out.println("Test() init.");
}
private Test(String name) {
// 不能与实例域变量同名
// String name; // error!
System.out.println("Test(\"" + name + "\") init.");
}
}
public class ConstructorTest {
public class Nested1 {
}
public static class Nested2 {
}
public static void main(String[] args) {
try {
// 包含私有和受保护构造器,但不含超类
System.out.println("Test "
+ Test.class.getDeclaredConstructors().length);
// 仅public构造器
System.out.println("Test " + Test.class.getConstructors().length);
// 反射方式实例化
Object obj = Test.class.newInstance();
Constructor constructor = Test.class.getConstructor(null);
obj = constructor.newInstance(null);
// 可以访问private,调用则因默认有访问控制,报错,setAccessible后才可以
constructor = Test.class.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
obj = (Test) constructor.newInstance("main"); // ok
// 内部类反射实例化
// 1.非静态内部类,需要外部类实例引用
// obj = Nested1.class.newInstance(); // error!
// constructor = Nested1.class.getConstructor(null);
// obj = constructor.newInstance(null); // error!
// 2.静态类则不需要
constructor = Nested2.class.getConstructor(null);
obj = constructor.newInstance(null); // ok
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果
Test 2
Test 1
Test() init.
Test() init.
Test(“main”) init.