A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王亮 黑马帝   /  2011-7-21 16:50  /  2284 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[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或者默认的级别的对象)?是这样吗?

评分

参与人数 1技术分 +1 收起 理由
admin + 1 有点意思,哪位同学给个答案

查看全部评分

1 个回复

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

评分

参与人数 1技术分 +1 收起 理由
admin + 1 勉强给1分吧

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马