非深入探尋Java反射機制: Private Fields and Private Methods

藉助於Java的反射機制,我們可以訪問一個類的私有成員及私有函數


Accessing Private Fields

在前面,我們說過,Class.getField(String)以及Class.getFields()這兩個方法只能返回public的成員。

如果想訪問private成員,需要使用函數Class.getDeclaredField(String)和Class.getDeclaredFields(),如下

public class A {
	private String m;	
	
	public A(String m) {
		this.m = m;
	}
}

public class B {
	public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
		A objA = new A("Hello Ruby");		
		Field field = A.class.getDeclaredField("m"); // 不能返回父類的成員
		field.setAccessible(true);		// 將原本私有的field變量設置爲可見	
		String value = (String)field.get(objA);		
		System.out.println(value);  // 結果爲  Hello Ruby
	}
}


Accessing Private Methods

通過Class.getMethod(String, Class[] parameterTypes)以及Class.getMethods()只能返回一個類中的public方法。

如果想訪問private方法,需要Class.getDeclaredMethod(String name, Class[] parameterTypes)以及Class.getMethods(),如下

public class A {
	private String m;	
	
	public A(String m) {
		this.m = m;
	}
	
	private String f() {
		return m;
	}
}


public class B {
	public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
		A objA = new A("Hello Ruby");		
		Method method1 = A.class.getDeclaredMethod("f", null);
		method1.setAccessible(true);
		String value = (String)method1.invoke(objA, null);
		System.out.println(value);
	}
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章