2010-12-05 76 views
2

因此,例如,StringBuilder繼承自抽象類AbstractStringBuilder。據我瞭解,StringBuilder本身沒有字段(除了serialVersionUID)。相反,其狀態由AbstractStringBuilder中的字段表示,並通過在其覆蓋的方法的實現中調用super來操縱。如何通過反射訪問抽象父類中的實例字段?

是否有通過反射的方式來獲得命名value私人char陣列AbstractStringBuilder宣佈與中StringBuilder特定實例相關聯?這是我得到的最接近的。

import java.lang.reflect.Field; 
import java.util.Arrays; 

public class Test 
{ 
    public static void main(String[ ] args) throws Exception 
    { 
     StringBuilder foo = new StringBuilder("xyzzy"); 
     Field bar = foo.getClass().getSuperclass().getDeclaredField("value"); 
     bar.setAccessible(true); 
     char[ ] baz = (char[ ])bar.get(new StringBuilder()); 
    } 
} 

這使我得到一個由16個空字符組成的數組。請注意,我正在尋找涉及反射的解決方案,因爲我需要的通用技術不限於StringBuilder。有任何想法嗎?

+0

您爲什麼認爲Object類有一個名爲value的字段? – RoflcoptrException 2010-12-05 22:41:53

+0

@Roflcoptr我不這麼認爲。 `AbstractStringBuilder`有一個名爲`value`的字段。 – gdejohn 2010-12-05 22:43:28

回答

7
char[ ] baz = (char[ ])bar.get(new StringBuilder()); 

您的問題是,你檢查了新的StringBuilder ......所以當然是空的(16個字符是默認的大小)。您需要通過foo

0

這可能值得在Apache Commons BeanUtils庫中查找。這裏是他們的API Javadocs的鏈接。該庫包含許多使Reflection更易於使用的高級方法。