【问题标题】:Can I get all methods of a class?我可以得到一个类的所有方法吗?
【发布时间】:2011-07-13 02:22:01
【问题描述】:

假设我有一个 .class 文件,我可以获取该类中包含的所有方法吗?

【问题讨论】:

    标签: java class methods


    【解决方案1】:

    要了解所有方法,请在控制台中使用此语句:

    javap -cp jar-file.jar packagename.classname

    javap class-file.class packagename.classname

    或者例如:

    javap java.lang.StringBuffer

    【讨论】:

      【解决方案2】:

      直接来自源:http://java.sun.com/developer/technicalArticles/ALT/Reflection/ 然后我将其修改为自包含,不需要命令行中的任何内容。 ;-)

      import java.lang.reflect.*;
      
      /** 
      Compile with this:
      C:\Documents and Settings\glow\My Documents\j>javac DumpMethods.java
      
      Run like this, and results follow
      C:\Documents and Settings\glow\My Documents\j>java DumpMethods
      public void DumpMethods.foo()
      public int DumpMethods.bar()
      public java.lang.String DumpMethods.baz()
      public static void DumpMethods.main(java.lang.String[])
      */
      
      public class DumpMethods {
      
          public void foo() { }
      
          public int bar() { return 12; }
      
          public String baz() { return ""; }
      
          public static void main(String args[]) {
              try {
                  Class thisClass = DumpMethods.class;
                  Method[] methods = thisClass.getDeclaredMethods();
      
                  for (int i = 0; i < methods.length; i++) {
                      System.out.println(methods[i].toString());
                  }
              } catch (Throwable e) {
                  System.err.println(e);
              }
          }
      }
      

      【讨论】:

      • 那么,我用 myClass 名称替换 'Class'?
      • 你可以从命令行使用它java DumpMethods com.mypackage.MyClass
      • 您也可以将args[0] 替换为"com.mypackage.MyClass"。如果它使用默认包,你可以使用"MyClass"
      • @Eng 我将其编辑为完全独立。如您所见,DumpMethods 类有 4 个方法(foo、bar、baz 和 main),这些方法都在输出中表示。为了好玩,请将"DumpMethods" 替换为"java.util.List"。 :-)
      • 继承方法呢?如果需要,请参见此处:stackoverflow.com/a/31204747/363573
      【解决方案3】:
      package tPoint;
      
      import java.io.File;
      import java.lang.reflect.Method;
      import javax.xml.parsers.DocumentBuilderFactory;
      
      import org.w3c.dom.Document;
      
      public class ReadClasses {
      
      public static void main(String[] args) {
      
          try {
              Class c = Class.forName("tPoint" + ".Sample");
              Object obj = c.newInstance();
              Document doc = 
              DocumentBuilderFactory.newInstance().newDocumentBuilder()
                      .parse(new File("src/datasource.xml"));
      
              Method[] m = c.getDeclaredMethods();
      
              for (Method e : m) {
                  String mName = e.getName();
                  if (mName.startsWith("set")) {
                      System.out.println(mName);
                      e.invoke(obj, new 
                String(doc.getElementsByTagName(mName).item(0).getTextContent()));
                  }
              }
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
      
      }
      

      【讨论】:

      • 使用上面的代码你可以读取类中的所有方法并将参数作为字符串传递
      【解决方案4】:

      您可以使用Reflection API

      【讨论】:

        【解决方案5】:
        public static Method[] getAccessibleMethods(Class clazz) {
            List<Method> result = new ArrayList<Method>();
            while (clazz != null) {
                for (Method method : clazz.getDeclaredMethods()) {
                    int modifiers = method.getModifiers();
                    if (Modifier.isPublic(modifiers) || Modifier.isProtected(modifiers)) {
                        result.add(method);
                    }
                }
                clazz = clazz.getSuperclass();
            }
            return result.toArray(new Method[result.size()]);
        }
        

        【讨论】:

          猜你喜欢
          • 2015-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多