2015-11-23 13 views
6

Ich habe über Klassen und insbesondere über anonyme innere Klassen nachgedacht. Das brachte mich dazu, mich zu fragen, was ist der Zugangstyp einer anonymen inneren Klasse?Was ist der Zugriffstyp einer anonymen inneren Klasse?

Ich realisiere in den meisten Fällen, dass dies nichts ändern wird, aber es könnte zum Beispiel für die Reflexion einen Unterschied machen. Ich habe einige Fragen gesehen, die nach Problemen mit der Reflexion fragen, um auf die Inhalte anonymer innerer Klassen zugreifen zu können.

Ich habe diese Frage (ein Beispiel für dieses Problem) finden: access exception when invoking method of an anonymous class using java reflection

Und diese Antwort, die es ist privat, aber der Schreiber war nicht in der Lage zu bestätigen, schlägt vor: https://stackoverflow.com/a/2659647/3049628

+0

Ich denke, die Frage, die Sie zitieren, auf die Klasse selbst nicht viel Licht nicht vergießen. Der Fehler ist auf einen Fehler zurückzuführen, und der Fehler betrifft die Barrierefreiheit der Methode, nicht die Klasse. Die Klasse selbst ist kein Mitglied und daher ist der "Zugang" zu ihr bedeutungslos. – RealSkeptic

Antwort

4

Sieht aus wie sie sind öffentlich , aber die Implementierung von Method.invoke des JDK hat einen (lang andauernden) Fehler. Siehe bug 4071957. Der verknüpfte Fehler entspricht nicht wirklich unserer Situation, jedoch aggregiert er alle Arten von Method.invoke Zugangskontrollproblemen über innere Klassen und wurde als Duplikat von bug 4819108 markiert, das in der akzeptierten Antwort der von Ihnen erwähnten SO-Frage verlinkt war .

+1

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

+0

Ja, es sieht so aus, als ob sie das Classfile-Format seit Java 1.1 ändern wollten, was helfen würde, dieses Problem zu beheben. Es wurde im Jahr 2014 aktualisiert, vielleicht haben sie nicht alle Hoffnung aufgegeben, es zu tun ... – Aaron

3

Die class selbst scheint Paket der äußeren Klasse zu haben.

getModifiers() Wert ist 8, die wie folgt ist: static, package private.

Seine static (warum?). Ich kann nicht auf Main.this von innerhalb einer anonymen Klasse in Main verweisen.

Es ist package private. Dennoch bedeutet die Zugriffsebene einer anonymen Klasse nicht einmal viel, da Sie ihren Typ zur Kompilierungszeit nicht wie eine normale Klasse verwenden können.

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 Danke. wieder getestet, Anon-Klasse hat dasselbe Paket wie die äußere Klasse. –

+0

Ich denke, es ist nur statisch, weil es in einer statischen Methode deklariert ist. Bei jeder anderen Methode wäre es nicht statisch. Da es "Paket privat" ist - es ist eigentlich nur der Standard, der als "Paket privat" interpretiert wird. Aber das ist bedeutungslos für eine Klasse *, die weder Mitglied noch Top-Level * ist. – RealSkeptic

Verwandte Themen