2015-11-23 11 views
6

Ho pensato alle lezioni e in particolare alle classi interne anonime. Questo mi ha portato a chiedermi quale sia il tipo di accesso di una classe interiore anonima?Qual è il tipo di accesso di una classe interna anonima?

Mi rendo conto che nella maggior parte dei casi questo non cambierà nulla ma potrebbe fare la differenza per la riflessione, ad esempio. Ho visto diverse domande che mi chiedevano di avere problemi nell'usare la riflessione per accedere ai contenuti di classi interne anonime.

Ho trovato questa domanda (un esempio di questo problema): access exception when invoking method of an anonymous class using java reflection

E questa risposta che suggerisce che è privata, ma lo scrittore è stato in grado di confermare: https://stackoverflow.com/a/2659647/3049628

+0

Penso che la domanda che lei cita non far molta luce sulla classe stessa. L'errore è a causa di un bug e il bug riguarda l'accessibilità del metodo, non la classe. La classe stessa non è un membro e quindi "l'accesso" a esso non ha senso. – RealSkeptic

risposta

4

Sembra che essi sono pubblici , ma l'implementazione Method.invoke di JDK ha un bug (di lunga esecuzione). Vedi bug 4071957.

Il bug collegato non corrisponde realmente alla nostra situazione, tuttavia aggrega tutti i tipi di problemi di controllo dell'accesso Method.invoke sulle classi interne ed è stato contrassegnato come duplicato di bug 4819108 che era collegato nella risposta accettata della domanda SO menzionata .

+1

Whoa, 'Submit Data: 1997-08-14' (!!) – Tgsmith61591

+0

Sì, sembra che abbiano voluto cambiare il formato del file di classe da java 1.1, che avrebbe aiutato a risolvere questo problema. È stato aggiornato nel 2014 quindi forse non hanno completamente abbandonato tutte le speranze di farlo ... – Aaron

3

Lo stesso class sembra avere un pacchetto di classe esterna.

getModifiers() valore è 8, che come per i commenti è: static, package private.

Il suo static (perché?). Non posso fare riferimento a Main.this dall'interno di una classe anonima in Main.

Il suo package private. Tuttavia, il livello di accesso di una classe anonima non significa nemmeno molto, dal momento che non è possibile utilizzare il suo tipo in fase di compilazione come una normale classe.

https://ideone.com/vzbdQ5

// JDK 8 
import java.lang.reflect.Modifier; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     Class anon = new Main() {}.getClass(); 

     System.out.println("Name:" + anon.getName()); // Main$1 
     System.out.println("Anonymous:" + anon.isAnonymousClass()); // true 
     System.out.println("Package:" + anon.getPackage()); // null 

     System.out.println("public ? " + Modifier.isPublic(anon.getModifiers())); // false 
     System.out.println("private ? " + Modifier.isPrivate(anon.getModifiers())); // false 
     System.out.println("protected ? " + Modifier.isProtected(anon.getModifiers())); // false 

     assert anon.newInstance() instanceof Main; 
     assert Class.forName(anon.getName()).newInstance() instanceof Main; 
    } 
} 
+0

@assylias Grazie. testato di nuovo, la classe anon ha lo stesso pacchetto della classe esterna. –

+0

Penso che sia solo statico perché è dichiarato in un metodo statico. In qualsiasi altro metodo, non sarebbe statico. Per quanto riguarda il "pacchetto privato" - in realtà è solo l'impostazione predefinita, che viene interpretata come "pacchetto privato". Ma questo non ha senso per una classe * che non è né un membro né un livello superiore *. – RealSkeptic

Problemi correlati