黑马程序员技术交流社区

标题: 反射问题 [打印本页]

作者: 何超    时间: 2013-12-9 21:40
标题: 反射问题
本帖最后由 何超 于 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. }
复制代码

真心搞不懂上面三个的错误到底是为什么!!!求知道的解释下!万分感谢!!!
作者: kongling    时间: 2013-12-9 22:40
1.getConstructor(),返回共有构造器,而你的构造器不是共有的
可是使用getDeclaredConstructor(),方法返回所有构造器
2.Method method=rec.getMethod("show", String.class);你得到的是带有
string 参数的show方法,然而你method.invoke(rt);没传String参数
method.invoke(rt,"A");正确
3.getField()方法只返回共有字段,
getDeclaredField()可以返回所有字段




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2