黑马程序员技术交流社区
标题:
反射问题
[打印本页]
作者:
何超
时间:
2013-12-9 21:40
标题:
反射问题
本帖最后由 何超 于 2013-12-10 09:18 编辑
为了使用反射创建的实验原始类
public class RefactTest {
int a1=1;
String b="str";
RefactTest(String a)
{
a="5";
System.out.println(a);
}
public String show(String a)
{
return a;
}
}
复制代码
反射运行类
import java.lang.reflect.*;
public class Refact {
public static void main(String[] args) throws Exception {
RefactTest rt=new RefactTest("3");
Class rec=rt.getClass();
//下面三行是可以正确运行的
Constructor con1=String.class.getConstructor(StringBuffer.class);
String a=(String)con1.newInstance(new StringBuffer("abc"));
System.out.println(a.charAt(1));
//编译无错 运行报错 java.lang.NoSuchMethodException: RefactTest.<init>(java.lang.String)
// Constructor con2=rec.getConstructor(String.class);
// con2.newInstance("9");
//编译无错 运行报错Exception in thread "main"
//java.lang.IllegalArgumentException: wrong number of arguments
//我真不知道这个getMethod()里面的参数哪里传错了 明明是String类型的
// Method method=rec.getMethod("show", String.class);
// String a1=(String)method.invoke(rt);
//正确
Method method=rec.getMethod("show", String.class);
String a3=(String)method.invoke(rt,"A");
System.out.println(a3);
//运行报错 Exception in thread "main" java.lang.NoSuchFieldException: a
//但是我在原始类中定义的就是 int a1啊 API的Class中 Field getField(String name) ;
Field field=rec.getField("a1");
// String i=(String)field.get(rt);
// System.out.println(i);
}
}
复制代码
真心搞不懂上面三个的错误到底是为什么!!!求知道的解释下!万分感谢!!!
作者:
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