2013-04-03 51 views
-1

我想檢索Java類中給定屬性的所有訪問器。我嘗試了一些東西,但它沒有給出我期待的輸出。對於如:如何獲取類中屬性的所有訪問器方法?

public class demo { 
    private String abc; 

    public String getAbc() { 
     return abc; 
    } 

    public void setAbc(String abc) { 
     this.abc = abc; 
    } 

    public String fetchAbc() { 
     return abc; 
    } 
} 

這裏,abc屬性有兩個干將,我想找到有OCCURENCES在我的項目。我想下面的代碼,它使用BeanInfo的API,但它給了我只有一個訪問:

import java.beans.BeanInfo; 
import java.beans.IntrospectionException; 
import java.beans.Introspector; 
import java.beans.PropertyDescriptor; 

public class BeanDemo { 

    public void myMethod() throws IntrospectionException { 
     BeanInfo beanInfo = Introspector.getBeanInfo(demo.class); 

     for (PropertyDescriptor property : beanInfo.getPropertyDescriptors()) { 
      //all attributes of class. 
      property.getReadMethod(); // getter 
      property.getWriteMethod(); // setter 
     } 
    } 
} 

誰能告訴,如果有,可以用來完成此另一個API?我可以玩反思,但這不是正確的方式。謝謝。

+3

真的嗎?反思不正確的方式? – Ankit

+0

您正在使用「訪問者」這個術語的更廣泛的定義。BeanInfo API依賴於某些約定,並將訪問者定義爲遵循特定命名模式和簽名(又名getXXX,其中XXX是所討論的屬性)的方法。要做你正在嘗試的東西,你需要一些形式的靜態分析(使用像PMD這樣的工具)。 – Perception

+0

@ ay89 ...我需要檢查返回類型的每種方法,在這種情況下,我想 – Cycorax12

回答

0

我鼓勵你「用反思玩耍」,因爲它確實是正確的方式。

開始here,反映一般,或here,爲類。你也可以找到this reference page有用。

這裏有一個提示:

Method[] methods = demo.class.getMethods(); 
for (int i=0; i<methods.length; i++) { 
    Method method = methods[i]; 
    // Take a look at the Method documentation to find out more: 
    // http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html 

    // Or, look at the Method tutorial here: 
    // http://docs.oracle.com/javase/tutorial/reflect/member/method.html 
} 

退房的Class<T> classMethod class至少是。

+0

我可以玩反射....我沒有問題,我需要檢查返回類型的名稱...是最佳的方式 – Cycorax12

0

第一張:following JavaBean conventions is helpful.如果你有一個方法說「檢索」,但它是一個實際的getter,它比你自己更容易混淆Java - 爲什麼應該有多種方法來獲得一個字段?

第二個:思考是你的朋友。您可以用很少的痛苦反思性地提取有關對象的信息,並檢索想要的結果。你應該看看the Reflection Trail,因爲它包含大量有用的信息來幫助你入門。

這是一個小樣本 - 它將獲得此類中標記爲「get」的所有方法。

public class StackOverflow { 
    public static void main(String[] args) throws ClassNotFoundException { 
     Method[] methods = Class.forName("Fake").getMethods(); 
     for(Method m : methods) { 
      if(!m.getDeclaringClass().equals(Object.class) && m.toGenericString().contains("get")) { 
       System.out.println(m.toGenericString()); 
      } 
     } 
    } 
} 

class Fake { 
    private String objField; 
    private int primitiveField; 
    private boolean[] arrayField; 

    public void setObjField(final String theObjField) { 
     objField = theObjField; 
    } 

    public void setPrimitiveField(final int thePrimitiveField) { 
     primitiveField = thePrimitiveField; 
    } 

    public void setArrayField(final boolean[] theArrayField) { 
     arrayField = theArrayField; 
    } 

    public String getObjField() { 
     return objField; 
    } 

    public int getPrimitiveField() { 
     return primitiveField; 
    } 

    public boolean[] getArrayField() { 
     return arrayField; 
    } 
} 

以上輸出:

public java.lang.String Fake.getObjField() 
public int Fake.getPrimitiveField() 
public boolean[] Fake.getArrayField() 
+0

如果objField有一個方法說fetchObjField ...在這種情況下,它將失敗...我想找到所有獲得單個屬性.. – Cycorax12

0

反射會只要看看這些方法的名稱和簽名,它不看他們怎麼做。那麼你能在這個基礎上可靠地確定一個get/set嗎?

您可以識別所有字段:aaa,bbb等,然後查找其簽名看起來像訪問者並且其名稱包含aaa或bbb等的所有方法。因此,您會發現getAaa(),setBbb()和fetchAaa ),甚至可能是bbbFetcher(),但你不能確定這些都是你正在尋找的東西。即使你掃描源是棘手的:考慮

getMagnitude() { return squareRoot(x squared plus y squared) } 

是一個getter?底線:字段和方法名稱的模式匹配將爲您提供候選人,但您必須設計出符合您需求的匹配規則。

+0

同意你,在這種情況下反射將如何工作... – Cycorax12

相關問題