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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© caijunsong 中级黑马   /  2014-3-27 20:33  /  1008 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 caijunsong 于 2014-3-28 12:13 编辑


  1. <BLOCKQUOTE>
  2. <DIV class=blockcode>
  3. <BLOCKQUOTE>import java.lang.reflect.*;
  4. class Person
  5. {
  6. private String name;
  7. private int age;
  8. double height;
  9. String[]body=new String[5];
  10. int []tel=new int[11];
  11. Person(String name,int age)
  12. {
  13. this.name=name;
  14. this.age=age;
  15. }
  16. Person()
  17. {
  18. this.name="noname";
  19. this.age=0;
  20. height=0.0;
  21. }
  22. public String getName()
  23. {
  24. return name;
  25. }
  26. public int getAge()
  27. {
  28. return age;
  29. }
  30. private void setAge(int age)
  31. {
  32. this.age=age;
  33. }
  34. public String toString()
  35. {
  36. return "名字:"+name+"年龄:"+age+"身高"+height+"米";
  37. }
  38. }
  39. public class Test
  40. {
  41. public static void main(String[]agrs)throws Exception
  42. {
  43. Class<Person> person=Person.class;
  44. Person p=(Person)person.newInstance();
  45. System.out.println(p);

  46. Constructor cr=Person.class.getConstructor(String.class,Integer.class);
  47. Object l=cr.newInstance(new String("xiaocai"),new Integer(22));//这里出现错误
  48. //运行错误提示如下:
  49. //Exception in thread "main" java.lang.NoSuchMethodException: cn.itcast.swing.Person.<init>(java.lang.String, java.lang.Integer)
  50. System.out.println(l);
  51. }
  52. }
复制代码


  1. <P> </P>
复制代码

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 caijunsong 于 2014-3-28 01:05 编辑

http://hi.baidu.com/winstontjf/item/c48a2416226889737a5f2547
这个地址 是关于构造函数反射 与权限关系的帖子 大家看看 应该会有很多的帮助

我看了帖子之后 看了我的代码
因为getConstructor这个函数 它只返回修饰符为public的公共访问构造函数  但是在看看我的Person类的构造函数 是没有修饰符的 也就是默认的包内
然后我用newInstance( )来创建Person对象,本来就没有public的构造函数返回,怎么能创建出对象了,于是就抛出了一个叫做java.lang.NoSuchMethodException的异常,也就是我的代码中出现的提示错误 我的代码的改正方法就是在原来Person类中的构造函数前面加public

而上面回复我的同学  你的代码时通过getDeclaredConstruct方法,这个方法可以返回类中所有的构造方法,既然有返回构造函数 ,只要调用对象newInstance方法,就能创建出Person对象,于是你的setAccessible(true);取消访问权限检查是多余的 ,你把代码改下 编译下 就能证明


评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
public static void main(String[] args) throws  Exception {
               
                Constructor<person> cons=person.class.getDeclaredConstructor(String.class,Integer.TYPE);
                cons.setAccessible(true);
                person p1 =cons.newInstance(new String("zhangsan"),39);
                System.out.println(p1.getName()+"-------"+p1.getAge());
               
                person p2 =person.class.newInstance();        // 用无参的构造函数new对象
                p2.setName("wuangwu");
                p2.setAge(30);
                System.out.println(p2.getName()+"------"+p2.getAge());
        }
我不知道你要问的是什么,不过我恰好做过这样的例子,就贴上来也许对你有帮助,Person类和你的差不多,一个有参,一个无参

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
郭黎明 发表于 2014-3-27 20:52
public static void main(String[] args) throws  Exception {
               
                Constructor cons=person.class.getDec ...

我的代码出错了  你们帮我找好看  那个错误提示  和位置我已经标出来了
回复 使用道具 举报
public class Test
{
public static void main(String[]agrs)throws Exception
{
Class<Person> person=Person.class;
Person p=(Person)person.newInstance();
System.out.println(p);

Constructor cr=Person.class.getDeclaredConstructor(String.class,int.class);  
cr.setAccessible(true);
Object l=cr.newInstance(new String("xiaocai"),new Integer(22));

System.out.println(l);
}
}
我做了下修改,可以运行了Constructor cr=Person.class.getDeclaredConstructor(String.class,int.class)这句代码里你得到perso类的字节码之后要用getDeclaredConstructor( )才能得到构造方法,还有要注意的是int.class==Integer.TYPE,int类型的参数要用int.class或者Integr.TYPE,得到构造方法后调用xxx..setAccessible(true)才能使用,这个就像成员变量的反射吧

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
怎么结束提问啊!!!!!
回复 使用道具 举报
郭黎明 发表于 2014-3-27 23:04
public class Test
{
public static void main(String[]agrs)throws Exception

我已经明白了  也谢谢你的提示 让我想到了权限
回复 使用道具 举报
本帖最后由 ily521125 于 2014-3-28 10:25 编辑
caijunsong 发表于 2014-3-28 01:10
怎么结束提问啊!!!!!


重新编辑帖子,将论坛提问改成提问结束

无标题.png (18.91 KB, 下载次数: 28)

无标题.png
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马