A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黎健东 中级黑马   /  2012-7-30 20:43  /  1797 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 凉宫蛋蛋 于 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就可以了

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
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);
      
      
   }
}
回复 使用道具 举报
而且。你getName本来就没有参数,你在invoke里面设置了参数。你看你invoke里面多了一个String.class 你在看看你定义的getName 参数里表不一样
回复 使用道具 举报
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);
}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  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:56
地板
如果你非要用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:15
7#
我用电脑敲完代码,然后传到手机上,然后在传到这。我苦逼啊我。。
回复 使用道具 举报
周坤 中级黑马 2012-7-30 22:04:19
8#
  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));
复制代码
直接改成这样就行了。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
谢谢楼上各位,我终于弄明白了
的确是那个参数的问题

如果调用的方法没有用到参数,就把它null就可以了
回复 使用道具 举报
郑正华 发表于 2012-7-30 21:50
Person obj = new Person("zzz");

Class clazz = obj.getClass();

人家是想通过构造赋值,然后获取对象吧?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马