簡體   English   中英

Java中的公共匿名內部類

[英]public anonymous inner class in Java

默認情況下,匿名內部類是否為私有? 我可以將它們公開嗎?

我需要通過反射訪問方法。

匿名內部類之所以是匿名的,是因為其原因:它們並不意味着只能通過引用變量/方法參數直接從外部訪問。 (出於同樣的原因,它們也是私有的。)

我猜您可能會嘗試使用其編譯器生成的名稱(例如, OuterClass$1 )通過反射來訪問此類,但是這是實現特定的,可能會在您將另一個匿名內部類添加到同一外部類時或在下一個外部類中更改JVM版本。 因此,這樣的解決方案將非常脆弱。

您實際上為什么要這樣做? 如果您解釋了您的實際問題,我們也許可以提供更好的選擇。

您可以通過反射訪問匿名內部類的方法。 請參見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將無法實現,請參閱對象反射的安全風險是什么?

警告:請考慮到匿名內部類是一次性類的定義。 一旦使用,您將再也不需要它們了。 就像@PéterTörök所說的那樣,要在沒有更多關於您的問題的上下文的情況下很難說,但是,如果您可以控制該類,則最好對該類取消匿名(將其設為私有內部類,甚至公開),並將該方法公開給需要它的類。

默認情況下,匿名內部類是私有的。 要與反射一起使用,您可以在這里查看-Java反射:如何檢索匿名內部類?

匿名內部類具有程序包私有(默認)訪問權限。 在Java 6中,如果在靜態上下文中聲明它們,則為final,但在其他上下文中聲明為final。 (我相信但尚未測試,Java 7中已對此進行了更改,因此它們始終是最終版本;請參閱Java語言規范的15.9.5節 。)

例如,此類有四個匿名內部類:

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$1foo1 )—私有程序包
  • InnerTest$2foo2 )—私有程序包
  • InnerTest$3foo3 )—私有和最終打包
  • InnerTest$4foo4 )—私有和最終打包

注意,匿名內部類實例所分配到的變量的訪問是無關緊要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM