回答
您可以通過反射訪問匿名內部類的方法。請參閱getDeclaredMethods()
。 請記得在Method
上撥打setAccessible(true)
以避免IllegalAccessException
。
Object testObject = new Object() {
private void testMe() {
System.out.println("testme");
}
};
Method m = testObject.getClass().getDeclaredMethod("testMe");
m.setAccessible(true);
m.invoke(testObject); // prints out "testme"
還要注意,如果有一個SecurityManager
這將是不可能的,看到What is the security risk of object reflection?
警告:要考慮到匿名內部類是一種一次性類定義。一旦使用,你再也不需要他們了。就像@PéterTörök所說,沒有更多關於你的問題的背景很難說清楚,但是,如果你能控制這個類,那麼可能會更好地對這個類進行匿名化(使私人內部類,甚至公開),並將該方法公開給需要它的類。
由於某種原因,匿名內部類是匿名的:它們並不意味着只能通過引用變量/方法參數從外部世界直接訪問。 (出於同樣的原因,他們都是私人了。)
我猜你可以嘗試使用它的編譯器生成的名稱(例如,OuterClass$1
)通過反射來訪問這樣的一類,但是,這種爲特定實現,可能會改變當您將另一個匿名內部類添加到相同的外部類或下一個JVM版本時。所以這樣的解決方案會非常脆弱。
你爲什麼要這麼做?如果你解釋你的實際問題,我們可能會提供一個更好的選擇。
我不同意。非匿名內部類和匿名內部類之間的唯一區別是後者沒有名稱。其原因是簡潔,而不是安全。所以匿名類的原因不能被公開只是沒有提出的語法。恕我直言。 – Dims 2012-03-23 16:07:17
+1雖然(這是匿名內部類固有的),但如果您擁有實例,則不需要使用編譯器生成的類名稱。 – 2012-03-23 16:10:11
@XaviLópez的確如此。如果你確實有實例,爲什麼你需要反思? – 2012-03-23 16:14:57
默認情況下匿名內部類是私有的。用於反射你可以看看這裏 - Java reflection: How can I retrieve anonymous inner classes?
匿名內部類具有默認(包私有)訪問權限,而非私有權限。 – 2012-03-23 16:26:42
我的錯誤感謝您糾正它 – aretai 2012-03-23 17:59:34
匿名內部類具有包私人(默認)訪問。在Java 6中,如果在靜態上下文中聲明它們,但在其他上下文中不是最終的,則它們是最終的。 (我相信,但還沒有測試,這在Java 7中已經更改,因此他們總是最終,見Section 15.9.5 of the Java Language Specification)
例如,這個類有四個匿名內部類:
public class InnerTest {
public Runnable foo1 = new Runnable() {
public void run() {foo1();}
void foo1() {}
};
private Runnable foo2 = new Runnable() {
public void run() {foo2();}
void foo2() {}
};
public static Runnable foo3 = new Runnable() {
public void run() {foo3();}
void foo3() {}
};
private static Runnable foo4 = new Runnable() {
public void run() {foo4();}
void foo4() {}
};
}
當使用javac編譯(版本1.6.0_26)它會生成四個匿名內部類。反編譯與javap -c
顯示:
InnerTest$1
(foo1
)—包私人InnerTest$2
(foo2
)—包私人InnerTest$3
(foo3
)—包私人和最終InnerTest$4
(foo4
)—包專用並且最終
注意,其中匿名內部類的實例是被分配的變量訪問是無關緊要的。
- 1. 匿名內部類
- 2. Java - 匿名內部類生命週期
- 3. Java:在匿名內部類中調用外部類方法
- 4. 聲明匿名內部類
- 5. 從內部匿名類
- 6. java.lang.NoClassDefFoundError:在匿名內部類
- 7. C中的匿名內部類#
- 8. Groovy中的匿名內部類
- 9. Python中的匿名內部類
- 10. 匿名內部類(優於非匿名內部類)的優點是什麼?
- 11. Java:使用局部變量的匿名內部類
- 12. 在Java中使用接口的匿名內部類
- 13. 如何將變量傳遞給Java中的匿名內部類?
- 14. Python有類似Java的匿名內部類嗎?
- 15. 確定公共代理是匿名的
- 16. 匿名類變成內部類
- 17. Java的匿名類
- 18. 公共財產的類內部使用
- 19. 創建內部類的公共屬性?
- 20. 匿名內部類和好的做法
- 21. Spring AOP的匿名內部類
- 22. 在Java中,我如何從內部引用一個匿名內部類?
- 23. 的Java枚舉匿名內部類和反射
- 24. 注入匿名內部類(GIN)
- 25. 參數傳遞到匿名內部類
- 26. 打破了由匿名內部類
- 27. [SonarLint]:使這個匿名內部類lambda
- 28. Eclipse匿名內部類型模板
- 29. 如何從Java中的匿名內部類獲取對封閉類的引用?
- 30. 如何在兩個內部匿名類中共享ArrayList的相同副本?
如果它是一個匿名的內部類,編譯器將如何知道去哪裏調用這些方法?爲什麼你不只是創建一個公共類,並在你需要的地方使用它而不是使用匿名類? – jzworkman 2012-03-23 15:33:55