我試圖使用反射來創建匿名類的實例。但諷刺的是,我在瞬間看到了奇怪的行爲。匿名類混淆的動態構造
請看看這些代碼相似的片段
public class HideAndSeek {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws IllegalAccessException, InstantiationException{
final String finalString = "I'm final :)";
Object object2 = new Object(){
{
System.out.println("Instance initializing block");
System.out.println(finalString);
}
private void hiddenMethod() {
System.out.println("Use reflection to find me :)");
}
};
Object tmp = object2.getClass().newInstance();
}
}
此代碼的工作很好,輸出預計
Instance initializing block
I'm final :)
Instance initializing block
I'm final :)
這個我決定用簡單的方式來改變代碼後(剛添加java.util.Calendar)
import java.util.Calendar;
public class HideAndSeek {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws IllegalAccessException, InstantiationException{
final String finalString = "I'm final :)";
final Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime().toString()); //works well
Object object2 = new Object(){
{
System.out.println("Instance initializing block");
System.out.println(finalString);
//simply added this line
System.out.println(calendar.getTime().toString());
}
private void hiddenMethod() {
System.out.println("Use reflection to find me :)");
}
};
Object tmp = object2.getClass().newInstance();
}
}
這裏是輸出,我得到了:
Wed Aug 17 02:08:47 EEST 2011
Instance initializing block
I'm final :)
Wed Aug 17 02:08:47 EEST 2011
Exception in thread "main" java.lang.InstantiationException: HideAndSeek$1
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at HideAndSeek.main(HideAndSeek.java:29)
如您所見 - 新實例尚未創建。
有沒有人可以解釋我,這種變化的原因?
謝謝
如果日曆instnace不是最終的呢? – SJuan76
@ SJuan76。 ...那麼你就不能將它傳遞給匿名的內部類。 –