黑马程序员技术交流社区

标题: 反编译怎么获取一个类中的所有方法? [打印本页]

作者: 张子凯    时间: 2013-3-8 18:43
标题: 反编译怎么获取一个类中的所有方法?
本帖最后由 张子凯 于 2013-3-9 20:24 编辑

刚看完毕老师视频第8天,最后看到一个获取类中方法的方法:getMethod(),但是我却没法调用打印,求解。
  1. /*
  2. Object:所有类的直接或间接父类。
  3. 该类中定义的肯定是所有对象都具备的功能。

  4. Object类中已经提供了对象是否相同的比较方法,如果自定义类中也有比较相同的功能,没必要重新定义。
  5. 只要演戏父类中的功能,建立自己特有比较内容即可,这就是覆盖。
  6. */

  7. class Demo //extends Object
  8. {
  9.         private int num;
  10.         Demo(int num)
  11.         {
  12.                 this.num = num;
  13.         }
  14.         public boolean equals(Object obj)        //Object obj = new Demo();
  15.         {
  16.                 if(!(obj instanceof Demo))                //因为可以接受所有类,所以此处判断一下是否同类,更健壮
  17.                                                                                 //当父类中已经提供了相同功能时,子类想建有自身特有内容的比较,这时就复写父类的功能,
  18.                                                                                 //此时用到向下类型转换和类型判断。
  19.                         return false;                                
  20.                 Demo d = (Demo) obj;                        //多态,向下转型
  21.                 return this.num == d.num;
  22.         }
  23.         public String toString()                        //父类中的此功能没什么作用,一般都复写,还有equals等。
  24.         {
  25.                 return "demo:"+num;
  26.         }
  27. }

  28. class Person
  29. {
  30. }

  31. class ObjectDemo
  32. {
  33.         public static void main(String[] args)
  34.         {
  35.                 Demo d1 = new Demo(4);
  36. <span style="line-height: 1.5;">Class c = d1.getClass();</span>
  37.                 System.out.println(c);
  38.                 //System.out.println(Demo.class.getMethod());        //编译出错
  39.                 System.out.println(d1.getMethod());                                //同样编译出错,主要就是想知道反编译怎么获取一个类中的所有方法?
  40.                

  41.         }
  42. }
复制代码

作者: 克零岚    时间: 2013-3-8 19:12
本帖最后由 克零岚 于 2013-3-8 19:16 编辑

你的System.out.println(Demo.class.getMethod());代码有错的(j即方法是有参数的,注意啦),jdk文档中是这样的public Method getMethod(String name,Class<?>...parameterTypes),很显然这个getMethod()不符合你的情景,如下是我修改后的代码,就改了main方法中的一些代码,请参阅:
  1. import java.lang.reflect.Method;

  2. class Demo // extends Object

  3. {

  4.         private int num;

  5.         Demo(int num)

  6.         {

  7.                 this.num = num;

  8.         }

  9.         public boolean equals(Object obj) // Object obj = new Demo();

  10.         {

  11.                 if (!(obj instanceof Demo)) // 因为可以接受所有类,所以此处判断一下是否同类,更健壮

  12.                         // 当父类中已经提供了相同功能时,子类想建有自身特有内容的比较,这时就复写父类的功能,

  13.                         // 此时用到向下类型转换和类型判断。

  14.                         return false;

  15.                 Demo d = (Demo) obj; // 多态,向下转型

  16.                 return this.num == d.num;

  17.         }

  18.         public String toString() // 父类中的此功能没什么作用,一般都复写,还有equals等。

  19.         {

  20.                 return "demo:" + num;

  21.         }

  22. }

  23. class Person

  24. {

  25. }

  26. public class ObjectDemo

  27. {

  28.         public static void main(String[] args)

  29.         {

  30.                 Demo d1 = new Demo(4);

  31.                 Class c = d1.getClass();

  32.                 System.out.println(c);
  33.                 Method[] methods = Demo.class.getMethods();
  34.                 for (Method method : methods) {
  35.                         System.out.println(method);
  36.                         System.out.println(method.getName());
  37.                 }
  38.   

  39.   
  40.         }

  41. }
复制代码

作者: 张子凯    时间: 2013-3-9 20:23
克零岚 发表于 2013-3-8 19:12
你的System.out.println(Demo.class.getMethod());代码有错的(j即方法是有参数的,注意啦),jdk文档中是这 ...

谢谢,试了一下可以,发现自己没import java.lang.reflect.Method;,而且对里边的函数调用也有问题。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2