2014-10-10 32 views
0

我创建了一个类似于javap的java反射程序。一切工作正常,但我想知道是否有更好的方式来显示输出。我的意思是我喜欢在每个方法的争论中取出java.lang.String。这是我的方法。 ex。公共静态无效的compareTo(String s)将如何使java反射程序输出看起来更好?

public static void displayMethods(String s) 
       throws ClassNotFoundException 
{ 
    Class<?> c1 = Class.forName(s); 
    Method [] con = c1.getDeclaredMethods(); 
    for(Method c: con) 
     println(c); 
} 

这里是我的输出

public boolean java.lang.String.equals(java.lang.Object) 
public java.lang.String java.lang.String.toString() 
public int java.lang.String.hashCode() 
public int java.lang.String.compareTo(java.lang.Object) 
public int java.lang.String.compareTo(java.lang.String) 
public int java.lang.String.indexOf(java.lang.String,int) 
static int java.lang.String.indexOf(char[],int,int,java.lang.String,int) 
static int java.lang.String.indexOf(char[],int,int,char[],int,int,int) 
+0

“类”和“方法”中有很多方法可用于生成更好的输出。包括通用的“Type”实现。这一切都取决于你想要投入多少工作以及你想要输出什么样的输出。 – PeterK 2014-10-10 23:42:27

回答

0

这里是一个快速和肮脏的解决方案:

for (Method method : clazz.getDeclaredMethods()) { 
    StringBuilder output = new StringBuilder(); 
    output.append(Modifier.toString(method.getModifiers())); 
    if (method.getModifiers() != 0) { 
     output.append(" "); 
    } 
    output.append(method.getReturnType().getSimpleName()) 
      .append(" ") 
      .append(method.getName()) 
      .append("("); 
    for (Parameter param : method.getParameters()) { 
     output.append(Modifier.toString(param.getModifiers())); 
     boolean firstParam = true; 
     for (Parameter param : method.getParameters()) { 
      if(!firstParam){ 
       output.append(", "); 
      } 
      firstParam = false; 
      output.append(param.getType().getSimpleName()); 
     } 
     output.append(param.getType().getSimpleName()); 
    } 
    output.append(")"); 
    System.out.println(output); 
} 

例输出public static final String foo(int x, String y)

public static final String foo(int, String) 

输出包含返回类型而不是声明类型,但可以轻松更改该类型。对于包含例外的更优化的输出,您可以查看Method.toString()的源代码并根据您的需求进行调整。