Wiem, że to pytanie jest teraz prawie trzy lata, ale uważam, że część pytania wciąż nie odpowiedział:
A: to znaczy, że klasa B nie jest już prywatnym W czasie wykonywania?
Carlos Heubergers komentarz na skaffmans odpowiedź sugeruje, klasa B
wciąż private
do innych klas w pakiecie.
Prawdopodobnie jest odpowiedni dla języka programowania Java, tj. Nie można odwoływać się do klasy B
z innej klasy. Przynajmniej nie bez użycia refleksji (z pomocą której również prywatni członkowie klasy mogą być dostęp z zewnątrz), ale jest to kolejna kwestia.
Ale ponieważ JVM nie ma żadnej koncepcji klasy wewnętrznej (jak stany skaffman), zadałem sobie pytanie, w jaki sposób widoczność "dostępna przez jedną klasę" jest realizowana na poziomie bajtodu. Odpowiedź: Nie jest w ogóle realizowana, ponieważ JVM wewnętrzna klasa wygląda jak normalna prywatna klasa pakietowa. To znaczy, jeśli sam napiszesz kod bajtowy (lub modyfikujesz go wygenerowany przez kompilator), możesz bez problemu uzyskać dostęp do klasy B
.
Dostęp do wszystkich metod syntezatora syntetycznego można uzyskać ze wszystkich klas w tym samym pakiecie. Jeśli więc przypiszesz wartość do prywatnego pola klasy A
w metodzie klasy B
, zostanie wygenerowana syntetyczna metoda dostępu z domyślną (tj. Niepodzielną pakietowo) widocznością w klasie A
(o nazwie podobnej do access$000
), która ustawi dla Ciebie wartość. Ta metoda ma być wywołana tylko z klasy B
(i rzeczywiście może być wywołana tylko z tego przy użyciu języka Java).Ale z punktu widzenia JVM jest to tylko metoda jak każda inna i może być wywołana przez dowolną klasę.
Tak więc, aby odpowiedzieć na pytanie:
- Od języków Java punktu widzenia, klasa
B
jest i pozostaje prywatne.
- Z perspektywy JVM klasa
B
(lub lepiej: klasa A$B
) nie jest prywatna.
OK, widzę to. Dla mnie oznacza to, że uniknę użycia klas wewnętrznych, jak w przykładzie, może tylko doprowadzić do zamieszania. – Gerard
Nie zawracam ci głowy. To ostrzeżenie dla konkretnego kompilatora nie jest specjalnie przydatne dla nikogo, metody syntetyczne są używane przez cały czas w klasach wewnętrznych i nie mają znaczącego wpływu. – skaffman
IMHO metody syntetyczne były niepotrzebnym dodatkiem do języka. Samo użycie zakresu pakietu dla "prywatnych" członków (które i tak robi kompilator pod maską) było zadowalającym rozwiązaniem. – finnw