3 回答

TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊
這應(yīng)該演示如何解決它:
import java.lang.reflect.Field;
class Super {
private int i = 5;
}
public class B extends Super {
public static void main(String[] args) throws Exception {
B b = new B();
Field[] fs = b.getClass().getSuperclass().getDeclaredFields();
fs[0].setAccessible(true);
System.out.println(fs[0].get(b));
}
}
輸出:
5

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
這樣就可以了:
private List<Field> getInheritedPrivateFields(Class<?> type) {
List<Field> result = new ArrayList<Field>();
Class<?> i = type;
while (i != null && i != Object.class) {
Collections.addAll(result, i.getDeclaredFields());
i = i.getSuperclass();
}
return result;
}
如果您使用EclEmma之類的代碼覆蓋工具,則必須當(dāng)心:它們?yōu)槊總€(gè)類都添加了一個(gè)隱藏字段。在EclEmma的情況下,這些領(lǐng)域是明顯的合成,而且可以過濾它們像這樣:
private List<Field> getInheritedPrivateFields(Class<?> type) {
List<Field> result = new ArrayList<Field>();
Class<?> i = type;
while (i != null && i != Object.class) {
for (Field field : i.getDeclaredFields()) {
if (!field.isSynthetic()) {
result.add(field);
}
}
i = i.getSuperclass();
}
return result;
}
添加回答
舉報(bào)