Perché il tipo "Pacchetto" non eredita il tipo "AccessibleObject"?

1

Di seguito sono riportati i tipi rilevanti (in java) per l'elaborazione delle annotazioni,

Oltre a Field & Method types, Package type è usato anche nel contesto delle annotazioni con reflection, perché questi tipi implementano AnnotatedElement interface.

Questo contratto consente di accedere (in runtime) alle istanze di questi tipi per ottenere i loro metadati.

Perché Package non eredita AccessibleObject ?

    
posta user1787812 17.09.2017 - 20:54
fonte

2 risposte

4

Perché i pacchetti non sono accessibili. Che cosa significa "accessibile" nel nome AccessibleObject significa che ha una specifica di accesso e un ambito associato . Ad esempio, un oggetto potrebbe avere public di accesso (a questo punto il suo ambito è irrilevante), o private accesso da class Foobar , o accesso a pacchetto locale (predefinito) nel pacchetto com.example.foo . AccessibleObject fornisce anche l'accesso alle annotazioni dichiarate su un elemento di origine Java, ma questo non è il suo scopo principale.

I pacchetti non hanno questo. Tutti i pacchetti in Java sono pubblici e sono accessibili a livello globale. (Credo che Java 9 introduca un sistema che cambierà questo in qualche modo, ma credo che introduca solo un nuovo sistema di classificazione ortogonale che non inciderà su AccessibleObject e pacchetti).

I pacchetti possono avere annotazioni, ma l'accesso a questi è fornito attraverso mezzi alternativi, quindi non è necessario estendere AccessibleObject per fornire l'API pertinente per questo.

Ciò significa che i metodi in AccessibleObject (principalmente isAccessible() e setAccessible(boolean) ) sono irrilevanti per i pacchetti, perché i pacchetti sono sempre accessibili e questo non è qualcosa che può essere impostato. Pertanto, estendere questo tipo non sarebbe appropriato per loro.

    
risposta data 17.09.2017 - 21:36
fonte
2

Potresti anche chiedere "perché List collezioni non eredita da AccessibleObject " o qualsiasi altra classe in Java? La risposta breve è "perché non è necessario".

Lo spazio dei nomi java.lang.reflect ha lo scopo di fornire funzionalità di Reflection su qualsiasi oggetto nell'ecosistema Java, senza richiedere che l'oggetto erediti da una classe base Reflection, o qualsiasi altra classe. Questo è un po 'l'intero punto di riflessione: fare cose in Java che normalmente richiederebbero l'ereditarietà o la composizione.

L'hai detto tu stesso: "Il tipo di pacchetto è usato nel contesto delle annotazioni con riflessione". Sono le annotazioni a cui Reflection è interessato, non la gerarchia dell'ereditarietà delle classi.

    
risposta data 17.09.2017 - 21:16
fonte

Leggi altre domande sui tag