黑马程序员技术交流社区

标题: 反射中的一个问题 [打印本页]

作者: 王亮    时间: 2011-7-21 16:50
标题: 反射中的一个问题
[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不是有默认的构造方法吗,怎么出错?ClassnewInstance()方法,它是调用ConstructornewInstance()创建此对象,那为啥出错。去掉类ABC中的注释没问题,ABC.class.getDeclaredConstructor().newInstance();也没问题。

更进一步



在书上看到Hibernate为持久化类创建动态代理,要求持久化类的默认的构造(即不带参数的构造)方法访问级别必须是publicprotected或者默认的,不能是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或者默认的级别的对象)?是这样吗?

作者: 匿名    时间: 2011-7-21 17:14
我来解决你这个问题,默认我无参的构造方法是在对象创建时默认产生的一个无参构造方法,你使用反射的时候,反射机制在扫描这个类的时候应该是在没有定义无参构造方法时,不会默认给他追加一个,我是自己这么认为,有空研究下,源码我觉着问题会豁然开朗的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2