2015-02-24 55 views
3

我有以下bean類:如何通過名稱調用getter方法?

public class A{ 
     private String field; 

     public String getField() { 
      return field; 
     } 

     private String setField(String field) { 
      this.field = field; 
     } 

    } 

及以下等級:

public class B{ 

     public static void main(String[] args){ 
      A a = new A(); 
      //do stuff 
      String f = //get a's field value 
     } 
    } 

我怎樣才能獲得通過的class A特定對象的getter返回值?當然,我可以用Method.invoke(Object obj, Object... args)調用方法,但我不想手動編寫"get"前綴。有沒有可能避免這種情況?

+2

您可能想看看'java.beans.Introspector'。 – 2015-02-24 13:49:59

+0

@JonSkeet看起來像我在找什麼。你介意提供一個完整的答案嗎? – user3663882 2015-02-24 13:52:33

+1

@ user3663882 [查看本教程](http://www.programcreek.com/java-api-examples/index.php?api=java.beans.BeanInfo) – 2015-02-24 13:54:22

回答

24

如何使用java.beans.PropertyDescriptor

Object f = new PropertyDescriptor("field", A.class).getReadMethod().invoke(a); 

或再長一點的版本(這不正是同前一個)

PropertyDescriptor pd = new PropertyDescriptor("field", A.class); 
Method getter = pd.getReadMethod(); 
Object f = getter.invoke(a); 

PropertyDescriptor使我們能夠做很多事情,比如其getReadMethod()

獲取應該用於讀取p的方法性價比。

所以我們可以得到java.reflect.Method的實例,代表field的getter。我們現在需要做的只是在我們想要獲得結果的bean上調用它。

+0

太好了,謝謝。難道你不能用一些規範性引用來擴大你的答案。 – user3663882 2015-02-24 13:57:19

+0

閱讀PropertyDescriptor文檔:PropertyDescriptor(String propertyName,Class beanClass)' *通過使用getFoo和setFoo存取方法*,爲遵循標準Java約定的屬性構造一個PropertyDescriptor。 – 2015-02-24 14:02:15

+0

@ Jean-BaptisteYunès如果我們沒有相應的提交和設置程序,getField()會調用getter嗎? – user3663882 2015-02-24 15:39:39

0

獲取吸氣可以使用Java反射和豆PropertyDescriptor.-

new PropertyDescriptor(field.getName(), 
        Institute1.class).getReadMethod().invoke(inst1); 
4

另一個簡單的方法是使用基本的Java反射調用。

Method fieldGetter = A.getClass().getMethod("getField"); 
String f = fieldGetter.invoke(A).toString(); 

就這麼簡單。 乾杯!