黑马程序员技术交流社区

标题: 怎么用反射写getXXX方法? [打印本页]

作者: 黎健东    时间: 2012-7-30 20:43
标题: 怎么用反射写getXXX方法?
本帖最后由 凉宫蛋蛋 于 2012-7-31 00:19 编辑


  1. class Person {

  2.     private String name;

  3.     public Person(String name) {

  4.         this.name = name;

  5.     }

  6.     public String getName() {

  7.         return name;

  8.     }



  9.     public void setName(String name) {

  10.         this.name = name;

  11.     }

  12. }
复制代码
我这样写
  1. Person obj = new Person("zzz");
  2. Class clazz = obj.getClass();
  3.                 Method method = clazz.getMethod("getName", String.class);
  4.                 obj = method.invoke(obj, null);
  5.                 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
  1. package com.go2think;

  2. import java.beans.PropertyDescriptor;
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.Method;

  5. public class ReflectMethod {

  6.         /**
  7.          * 通过反射获取getName()方法
  8.          * @param args
  9.          * @throws Exception
  10.          */
  11.         public static void main(String[] args) throws Exception {
  12.                 // TODO Auto-generated method stub
  13.                 Class clazz = Class.forName("com.go2think.Person");
  14.                 Constructor cons = clazz.getConstructor(String.class);
  15.                 Method method = clazz.getMethod("getName", null);
  16.                 Object obj = cons.newInstance("黑马程序员");
  17.                 String name = (String) method.invoke(obj, null);
  18.                 System.out.println(name);
  19.                 //第二种想法,对于这种具有命名规则的java类,你完全可以看做是一个javaBean
  20.                
  21.                 String propertyName = "name";
  22.                 PropertyDescriptor pd =
  23.                         new PropertyDescriptor(propertyName, clazz);
  24.                 //getName对应的是读方法,是一种读取属性值的操作
  25.                 Method methodgetName=pd.getReadMethod();
  26.                 String name2=(String) methodgetName.invoke(obj, null);
  27.                 System.out.println(name2);
  28.         }

  29. }
复制代码

作者: 陈红建    时间: 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
  1. Person obj = new Person("zzz");
  2.                 Class clazz = obj.getClass();
  3.                 Method method = clazz.getMethod("getName", null);//这里有个参数问题
  4.                 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