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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史小兵 中级黑马   /  2012-11-1 20:01  /  1603 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.lang.reflect.Constructor;

public class Test {
        public static void main(String[] args) throws NoSuchMethodException, SecurityException{
                Test2 t=new Test2("haha");
                Class c=t.getClass();
                Constructor ctr=c.getConstructor(String.class);
//为什么在此处老是输出找不到该方法的错误?
                System.out.println(ctr);
        }

}
class Test2{
        String name;
//这里明明已经定义好了这个构造方法了啊!
        Test2(String name){
                this.name=name;
        }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
这个问题原因在于,你定义的构造方法是不是public级别而是默认级别的,而你使用反射获构造方法使用的是getConstructor,此方法只能获取public级别的构造方法;如此解决方案有如下两个:一是认构造方法改成public级别,或者使用Constructor ctr = c.getDeclaredConstructor(String.class);来获取非public级别的构造函数

评分

参与人数 1技术分 +1 收起 理由
邓艳秋 + 1

查看全部评分

回复 使用道具 举报
  查看getConstructor方法的源代码如下:
  public Constructor<T> getConstructor(Class<?>... parameterTypes)
        throws NoSuchMethodException, SecurityException {
        // be very careful not to change the stack depth of this
        // checkMemberAccess call for security reasons
        // see java.lang.SecurityManager.checkMemberAccess
        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
        return getConstructor0(parameterTypes, Member.PUBLIC);
    }
构造方法需要是public的,你才能反射的构造方法
故改为:
public Test2(String name){
           this.name=name;
   }

评分

参与人数 1技术分 +1 收起 理由
邓艳秋 + 1

查看全部评分

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