1. 程式人生 > >避免使用反射例項化非靜態內部類

避免使用反射例項化非靜態內部類

//考慮到從Java 程式到class 檔案的對映的複雜度,請避免使用反射來例項化內部類。
//更一般地講,當我們在用高階語言特性定義的程式元素之上使用反射的時候,一定要小心,
//從反射的視角觀察程式可能不同與從程式碼的視角去觀察它。
//一個非靜態的巢狀類的構造器,在編譯的時候會將一個隱藏的引數作為它的第一個引數,
//這個引數表示了它的直接外圍例項(immediately enclosing instance)。
//當你在程式碼中任何可以讓編譯器找到合適的外圍例項的地方去呼叫構造器的時候,這個引數就會被隱式地傳遞進去。
//但是,上述的過程只適用於普通的構造器呼叫,也就是不使用反射的情況。當你使用反射呼叫構造器時,
//這個隱藏的引數就需要被顯式地傳遞,這對於Class.newInstance 方法是不可能做到的。
//要傳遞這個隱藏引數的唯一辦法就是使用java.lang.reflect.Constructor。
class Outer {
	void greetWorld() throws Exception {
		//丟擲異常
		System.out.println( Inner.class.newInstance() );
	}
	void greetWorld1() throws Exception{
		Constructor<Inner> c = Inner.class.getConstructor(Outer.class);
		System.out.println(c.newInstance(Outer.this));
	}
	
	public class Inner {
		
		public String toString(){
			return "Hello world";
		}
	}
}