2014-10-10 48 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()的源代碼並根據您的需求進行調整。