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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 莫嘉伟 中级黑马   /  2013-3-2 20:14  /  1492 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Test8 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException,
        InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
        Class<?> clazz=Class.forName("Apple");
        System.out.println(clazz);
    Constructor ctr=clazz.getConstructor(String.class);
    Object obj=ctr.newInstance("我是一只用反射方式创造的苹果");
    System.out.println(obj);
   
       
        }
}
class Apple{
        String str="我是一只普通苹果";
        Apple(String str){
                this.str=str;
        }
        public void say(String s){
                System.out.println(str+":"+s);
        }
}
这代码抛出了java.lang.NoSuchMethodException异常,可是我Apple类中是有带一个字符串参数的构造器啊,怎么会没有呢,还是说我传类名的时候传错了,可是打印class对象输出也的确是Apple Class啊··求指点

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
因为你那个带参数的构造方法没有写成public的。。。你可以试试在前面加个public,应该就可以了。

评分

参与人数 1黑马币 +9 收起 理由
李培根 + 9 神马都是浮云

查看全部评分

回复 使用道具 举报
你Apple类里面的构造函数没有public修饰,是默认权限,getConstructor只能获取public权限的构造函数
你现在的代码有两种方式解决
1.修改class Apple
  1. class Apple{
  2.         String str="我是一只普通苹果";
  3.        public  Apple(String str){ //这里用publc修饰
  4.                 this.str=str;
  5.         }
  6.         public void say(String s){
  7.                 System.out.println(str+":"+s);
  8.         }
  9. }
复制代码
2.在 class Test8中使用getDeclaredConstructor
  1. public class Test8 {
  2.         public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException,
  3.         InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
  4.         Class<?> clazz=Class.forName("Apple");
  5.         System.out.println(clazz);
  6.     Constructor ctr=clazz.getDeclaredConstructor(String.class);//getDeclaredConstructor可以获取所有权限的构造函数
  7.     ctr.setAccessible(true);//由于Apple类里面的构造函数是默认权限,所以要安全检查
  8.     Object obj=ctr.newInstance("我是一只用反射方式创造的苹果");
  9.     System.out.println(obj);
  10.    
  11.         
  12.         }
  13. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个

查看全部评分

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