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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何超 中级黑马   /  2013-12-9 21:40  /  1147 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何超 于 2013-12-10 09:18 编辑

为了使用反射创建的实验原始类

  1. public class RefactTest {
  2.         int a1=1;
  3.         String  b="str";
  4.         RefactTest(String a)
  5.         {
  6.                  a="5";
  7.                  System.out.println(a);
  8.         }
  9.         public String show(String a)
  10.         {
  11.                 return a;
  12.         }
  13. }
复制代码


反射运行类
  1. import java.lang.reflect.*;
  2. public class Refact {
  3.         public static void main(String[] args) throws Exception {
  4.                 RefactTest rt=new RefactTest("3");
  5.                 Class rec=rt.getClass();
  6.                 //下面三行是可以正确运行的
  7.                 Constructor con1=String.class.getConstructor(StringBuffer.class);
  8.                 String a=(String)con1.newInstance(new StringBuffer("abc"));
  9.                 System.out.println(a.charAt(1));
  10.                
  11.                 //编译无错 运行报错 java.lang.NoSuchMethodException: RefactTest.<init>(java.lang.String)
  12. //                Constructor con2=rec.getConstructor(String.class);
  13. //                con2.newInstance("9");
  14.                
  15.                
  16.                 //编译无错 运行报错Exception in thread "main"
  17.                 //java.lang.IllegalArgumentException: wrong number of arguments
  18.                 //我真不知道这个getMethod()里面的参数哪里传错了 明明是String类型的
  19. //                Method method=rec.getMethod("show", String.class);
  20. //                String a1=(String)method.invoke(rt);

  21.                
  22.                 //正确
  23.                 Method method=rec.getMethod("show", String.class);
  24.                 String a3=(String)method.invoke(rt,"A");
  25.                 System.out.println(a3);

  26.                
  27.                 //运行报错 Exception in thread "main" java.lang.NoSuchFieldException: a
  28.                 //但是我在原始类中定义的就是 int a1啊   API的Class中 Field getField(String name) ;
  29.                 Field field=rec.getField("a1");
  30. //                String i=(String)field.get(rt);
  31. //                System.out.println(i);
  32.         }
  33. }
复制代码

真心搞不懂上面三个的错误到底是为什么!!!求知道的解释下!万分感谢!!!

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

1 个回复

倒序浏览
1.getConstructor(),返回共有构造器,而你的构造器不是共有的
可是使用getDeclaredConstructor(),方法返回所有构造器
2.Method method=rec.getMethod("show", String.class);你得到的是带有
string 参数的show方法,然而你method.invoke(rt);没传String参数
method.invoke(rt,"A");正确
3.getField()方法只返回共有字段,
getDeclaredField()可以返回所有字段

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

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