黑马程序员技术交流社区
标题:
怎么用反射写getXXX方法?
[打印本页]
作者:
黎健东
时间:
2012-7-30 20:43
标题:
怎么用反射写getXXX方法?
本帖最后由 凉宫蛋蛋 于 2012-7-31 00:19 编辑
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
复制代码
我这样写
Person obj = new Person("zzz");
Class clazz = obj.getClass();
Method method = clazz.getMethod("getName", String.class);
obj = method.invoke(obj, null);
return obj;
复制代码
这样怎么得不到zzz呢...该怎么写?
已经解决,的确是参数的问题,把Stirng.class改为null就可以了
作者:
陈红建
时间:
2012-7-30 21:20
import java.lang.reflect.Field;
class PersonClass
{
private String name;
public PersonClass(String name) {
this.name=name;
}
public String GetName()
{
return name;
}
public void setName(String name) {
this.name=name;
}
}
class Demo{
public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
PersonClass obj = new PersonClass("zzz");
//Method事用来获取方法的,Field才是获取成员变量的
Field fields = obj.getClass().getDeclaredField("name");
fields.setAccessible(true);//这里要设置你的私有权限为可见
//getClass().getDeclaredField(String name) 获取指定名字的字段
String str=(String)fields.get(obj);
System.out.println(str);
}
}
作者:
陈红建
时间:
2012-7-30 21:27
而且。你getName本来就没有参数,你在invoke里面设置了参数。你看你invoke里面多了一个String.class 你在看看你定义的getName 参数里表不一样
作者:
郑正华
时间:
2012-7-30 21:50
Person obj = new Person("zzz");
Class clazz = obj.getClass();
Method method = clazz.getMethod("getName", String.class); ←你的getName没有接收参数,你这里却加了个String.class,
obj = method.invoke(obj, null); ←这里肯定会报错的,类型不一样不可传递,
return obj;
---------------------------------------------------------
我给你改下代码吧,下面这样写起码程序不报错,但得不到 zzz,因为你getName方法本身就没有传递参数
Person obj = new Person("zzz");
Class clazz = Class.forName("cn.itcast.eclipse.Person");
Method method = clazz.getMethod("getName", null);
method.invoke(obj, null);
-------------------------------------------------------------
如果你想得到zzz的话,你就要在Person类中再写一个方法,这个方法里有输出name的语句;比如:
public void aa(){
System.out.println(name);
}
作者:
金龙
时间:
2012-7-30 21:56
package com.go2think;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectMethod {
/**
* 通过反射获取getName()方法
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Class clazz = Class.forName("com.go2think.Person");
Constructor cons = clazz.getConstructor(String.class);
Method method = clazz.getMethod("getName", null);
Object obj = cons.newInstance("黑马程序员");
String name = (String) method.invoke(obj, null);
System.out.println(name);
//第二种想法,对于这种具有命名规则的java类,你完全可以看做是一个javaBean
String propertyName = "name";
PropertyDescriptor pd =
new PropertyDescriptor(propertyName, clazz);
//getName对应的是读方法,是一种读取属性值的操作
Method methodgetName=pd.getReadMethod();
String name2=(String) methodgetName.invoke(obj, null);
System.out.println(name2);
}
}
复制代码
作者:
陈红建
时间:
2012-7-30 21:57
如果你非要用getmethod调用getname的话,你指定的参数是错误的。应该是 getMethod("getName")没有后面的string.class
mport java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
class PersonClass
{
private String name;
public PersonClass(String name) {
this.name=name;
}
public String getName()
{
return name;
}
public void setName(String name) {
this.name=name;
}
public void show()
{System.out.println("aaaa");}
}
class Demo{
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
PersonClass obj = new PersonClass("zzz");
Method method = obj.getClass().getMethod("getName");
System.out.println(method.invoke(obj));
}
}
作者:
陈红建
时间:
2012-7-30 22:03
我用电脑敲完代码,然后传到手机上,然后在传到这。我苦逼啊我。。
作者:
周坤
时间:
2012-7-30 22:04
Person obj = new Person("zzz");
Class clazz = obj.getClass();
Method method = clazz.getMethod("getName", null);//这里有个参数问题
System.out.println(method.invoke(obj, null));
复制代码
直接改成这样就行了。
作者:
黎健东
时间:
2012-7-31 00:18
谢谢楼上各位,我终于弄明白了
的确是那个参数的问题
如果调用的方法没有用到参数,就把它null就可以了
作者:
吴立杰
时间:
2012-7-31 09:25
郑正华 发表于 2012-7-30 21:50
Person obj = new Person("zzz");
Class clazz = obj.getClass();
人家是想通过构造赋值,然后获取对象吧?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2