2012-09-07 59 views
3

我有一個關於java反射的問題。java反射 - 如何獲取特定屬性的名稱

我需要某種方式來獲取在一個java類中特定字段的名稱。東西會像這樣:

class X{ 
    int x; 

    String getNameOfProperty(Object o){ 
     .... 
    } 
} 

然後調用

System.out.println(getNameOfProperty(x)); 

當我想獲得的 「x」;

我已成功使用

X.class.getDeclaredFields(); 

獲取類的字段,但那時我沒有財產和與之相關的領域對象之間有任何聯繫。

+1

您是否需要獲取字段的運行時值? – Redandwhite

+1

您是否使用[PropertyUtils](http://commons.apache.org/beanutils/)? –

+0

什麼是應用程序的**用戶功能**。需要執行?向我解釋,好像我是一個沒有技術的潛在最終用戶。知識。這樣做可能會導致更好的建議。 –

回答

3

您可以使用抽象語法樹來實現此目的。對於Eclipse,您可以找到詳細信息here

您還可以使用以下

- ANTLR

- javaparser

+0

是的,這絕對是一種方法,但我是AST的新手,他們似乎太複雜,我需要什麼。我的意思是,我沒有太多時間來投資這個......這是一個非常好的答案。 +1 – sebi

1

這是真的不清楚你要問這裏。

如果我已經正確理解你的問題Field Java中的類允許你在運行時獲得該字段的對象值。 getDeclaredFields返回你Field[]

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/reflect/Field.html

檢查get(Object o)方法

返回該字段所表示的字段的值,指定的對象上。如果該對象具有基本類型,則該值將自動包裝在對象中。

0

我想你可以在java.lang.reflect.Field類中使用getName()。在你的問題中,你的代碼中有許多字段已被讀取

請考慮core.Test1類中的這段代碼。對fieldName的調用將返回'i'和'd'以及42和6.(不是我在這裏使用getDouble和int適合Dboule,所以沒有問題。你可能需要檢查你正在調試的字段的類型首先得到一個值。)

這就是你所追求的?

private int i = 42; 
private double d = 6.0d; 

@Test 
public void test() { 
    try { 
     Class<?> clazz = Class.forName("core.Test1"); 

     Field[] fieldlist = clazz.getDeclaredFields(); 
     for (int i = 0; i < fieldlist.length; i++) { 
      System.out.println("field name = " + fieldlist[i].getName()); 
      System.out.println("value = " + fieldlist[i].getDouble(this)); 
      System.out.println("field type = " + fieldlist[i].getType()); 
      System.out.println("modifiers = " + Modifier.toString(fieldlist[i].getModifiers())); 
     } 
     } 
     catch (Throwable e) { 
     System.err.println(e); 
     } 
}   
+0

同意,但我怎麼知道在運行時fieldlist [我]是我的財產x的抽象?它可能是我可能擁有的其他一些屬性的抽象,比如y。我需要這個鏈接。 – sebi