[code=java]public class ReflectTest {
public static void main(String[] args){
try {
ABC.class.newInstance();//没问题
ABC.class.getConstructor().newInstance();
//这里出现java.lang.NoSuchMethodException
ABC.class.getConstructor();
//这里出现java.lang.NoSuchMethodException
}catch (Exception e){
e.printStackTrace();
}
}
}
class ABC{
//public ABC(){}
}[/code]
ABC不是有默认的构造方法吗,怎么出错?Class的newInstance()方法,它是调用Constructor的newInstance()创建此对象,那为啥出错。去掉类ABC中的注释没问题,ABC.class.getDeclaredConstructor().newInstance();也没问题。
更进一步
在书上看到Hibernate为持久化类创建动态代理,要求持久化类的默认的构造(即不带参数的构造)方法访问级别必须是public、protected或者默认的,不能是private的。但是
[code=java]import java.lang.reflect.*;
public class Reflect {
public static void main(String[] args){
try {
//ABC.class.newInstance();//出错
Constructor con = ABC.class.getDeclaredConstructor();
con.setAccessible(true);
con.newInstance();
}catch (Exception e){
e.printStackTrace();
}
}
}
class ABC{
private ABC(){}
}[/code]
是成功的。难道是使用类似ABC.class.newInstance();的语句创建对象(它可以创建构造方法为public、protected或者默认的级别的对象)?是这样吗?
|