大家谈谈对反射的理解 我的理解就是通过反射获得一个类的元数据,相当于数据库中的metaData一样 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 哎,我现在正是在这个问题上卡着了。用invoke居然出现java.lang.IllegalArgumentException: object is not an instance of declaring class实在不理解啊。 lhzongji(踪迹) 那是说你的 invoke 给的参数和方法原型的参数类型不匹配。 如果用 reflection 来做插件,就非常非常的方便。reflection 非常适合你这种情况:你在编写代码的时候不知道以后可能会用到什么样的类,但你知道这些类都有什么样的方法,或者这些类都实现某个接口,那么你就通过 reflection 来,根据 String 类型的类名参数,生成实例,并调用相关方法。 JavaBean 是 reflection 的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。 jamesfancy:请看看我的代码,如果解决了,我开贴给分。 Class[] c=new Class[1]; c[0]="".getClass(); java.lang.reflect.Method m=testClass.getClass().getDeclaredMethod("set" + testClass.getClass().getDeclaredFields()[i].getName(),c); Object b=m.invoke("test",new Object[0]);//这里出错。方法我是的得到了。但就是invoke时,出错。 那个方法的原型就是很普通一个set方法。 public void settestStr(java.lang.String str) { this.testStr = str; } 我的问题转到这里了,希望大家多帮忙啊。http://community.csdn.net/Expert/topic/3560/3560885.xml?temp=.9683039 这是我学习反射时候的一些总结Class A {private String a;public void setB(String b){this.a = b;}} 有一个类 A a = new A();获取Class 对象的三种方法:1.Class ca = a.getClass();2 Class ca = Class.forName("A");//参数是类名,必须要指明该类的路径: 包.类名3 Class ca = A.Class; 可以从class中获得 属性,方法,构造函数的特性 必须放在try,catch中 把forName 和newInstance 方法结合起来使用可以创建对象。如: A aa =(A)Class.forName("A").newInstance();返回的是object 需要上嗍(要捕捉异常) aa.getDeclaredFields(); 返回的是一个Field 数组aa.getDeclaredFields(String ) 返回的是一个Field的对象 注意:String参数必须是A 类中存在的对象 否则会有异常 Field field ;field.getName();//得到该字段名 field.getType().getName() //得到该字段的类型Class field.getType() //返回的是Class类型 --------------------------------------------------------------------------------Method[] method = mm.getDeclaredMethods(); //返回方法的对象String method[i].getName() //返回方法名String method[i].getReturnType().getName() //返回该方法的返回类型 method[i].getReturnType()//返回的是一个Class类--------------------------------------------------------------------------------Method 的运用,也就是bean 的运行机制 Method method_n = mm.getDeclaredMethod("setB",class_n); //参数的含义:1。字符串:该字符串必须是方法名,(该方法是已经存在的)2。Class[]类型 :表示为给方法的参数类型,如果没有参数就用null; obj method_n.invoke(obj,obj[]);执行该方法,这里就是执行 “setB”方法。参数意义:1。对象名称,这里就是 最早的 a 对象。2。该方法的参数,如果没有参数就设置为null。返回值是一个obj; 如果该方法是静态的 那么第一个参数也可以是null; 在这使用了该方法就想当于在对象 a里使用了 setB方法 因为set方法没有返回值 所以返回的是null同理如果使用的是 getB的方法那么就要 String str = (String)method_n.invoke(obj,obj[]); String uu = (String )method_n.invoke(b,ss);后来在开发中使用了一些反射的机制,主要用于公共的方法,让别人调用 我只总结出两点1 反射用来开发IDE2 反射用来开发某些框架 支持catblue(limiaomiao)一下下,呵呵 http://www.javayou.com/showlog.jspe?cat_id=-1&log_id=369 Java-GUI的简单问题:布局的嵌套是重点? swt的上中下框架布局 判断字符串编码格式问题 请问如何逐行删除JTextArea里的内容~~? 求助:JAVA怎么实现条形码? 往socket写东东,一次最多多少byte能成功发送? &和&& ,|和|| 连接数据库时报错,该如何解决? 借这里的人气,问一个关于SQL的问题,谢谢! 怎样理解“类类型之间的强制转换” 文件操作的问题 delete a file
reflection 非常适合你这种情况:你在编写代码的时候不知道以后可能会用到什么样的类,但你知道这些类都有什么样的方法,或者这些类都实现某个接口,那么你就通过 reflection 来,根据 String 类型的类名参数,生成实例,并调用相关方法。
c[0]="".getClass();
java.lang.reflect.Method m=testClass.getClass().getDeclaredMethod("set" + testClass.getClass().getDeclaredFields()[i].getName(),c);
Object b=m.invoke("test",new Object[0]);//这里出错。
方法我是的得到了。但就是invoke时,出错。
this.testStr = str;
}
Class A {
private String a;
public void setB(String b){
this.a = b;
}
}
有一个类 A a = new A();
获取Class 对象的三种方法:
1.Class ca = a.getClass();
2 Class ca = Class.forName("A");//参数是类名,必须要指明该类的路径: 包.类名
3 Class ca = A.Class;
可以从class中获得 属性,方法,构造函数的特性
必须放在try,catch中
把forName 和newInstance 方法结合起来使用可以创建对象。
如:
A aa =(A)Class.forName("A").newInstance();
返回的是object 需要上嗍
(要捕捉异常)
aa.getDeclaredFields(); 返回的是一个Field 数组
aa.getDeclaredFields(String ) 返回的是一个Field的对象 注意:String参数必须是A 类中存在的对象
否则会有异常
Field field ;
field.getName();//得到该字段名
field.getType().getName() //得到该字段的类型
Class field.getType() //返回的是Class类型
--------------------------------------------------------------------------------Method[] method = mm.getDeclaredMethods(); //返回方法的对象
String method[i].getName() //返回方法名
String method[i].getReturnType().getName() //返回该方法的返回类型
method[i].getReturnType()//返回的是一个Class类--------------------------------------------------------------------------------Method 的运用,也就是bean 的运行机制
Method method_n = mm.getDeclaredMethod("setB",class_n);
//参数的含义:
1。字符串:该字符串必须是方法名,(该方法是已经存在的)
2。Class[]类型 :表示为给方法的参数类型,如果没有参数就用null;
obj method_n.invoke(obj,obj[]);
执行该方法,这里就是执行 “setB”方法。
参数意义:
1。对象名称,这里就是 最早的 a 对象。
2。该方法的参数,如果没有参数就设置为null。
返回值是一个obj;
如果该方法是静态的 那么第一个参数也可以是null;
在这使用了该方法就想当于在对象 a里使用了 setB方法 因为set方法没有返回值 所以返回的是null
同理如果使用的是 getB的方法那么就要 String str = (String)method_n.invoke(obj,obj[]);
String uu = (String )method_n.invoke(b,ss);后来在开发中使用了一些反射的机制,主要用于公共的方法,让别人调用
2 反射用来开发某些框架