Java >> Java tutorial >  >> Tag >> protected

hvordan man begrænser beskyttet metodeadgang til kun underklasser

Det er ikke muligt. Du har et valg mellem protected modifikator (underklasser + klasser i samme pakke) og standardmodifikator (klasser i samme pakke). Der er ingen tredje mulighed.

Du kan heller ikke nemt håndhæve det under kørsel, da det ikke er nemt at finde klassenavnet og pakken til den kaldende kode. Se:Hvordan finder jeg den, der ringer til en metode ved hjælp af stacktrace eller refleksion?

En mulighed er at bruge aspectj. Det kan endda fungere på kompileringstidspunktet for at afvise kode, der forsøger at få adgang til protected metode fra den samme pakke, mens den ikke er en underklasse (med hjælp fra declare warning og declare error direktiver). Du vil sandsynligvis inkludere en kompileringsannotering som @SubclassesOnly . Se:Håndhævelse af kompileringstidsarkitektur revideret:AspectJ, Maven og Eclipse og kompileringstidskontrol med AspectJ.


Nemt:Fjern alle andre klasser fra pakken, og lad kun din basisklasse være der.

Det vil betyde, at de eneste klasser, der kan få adgang til din klasse, er fra en anden pakke.

I tilfælde af, at et andet bibliotek kopierer dit pakkenavn, kan du nemt tjekke pakken på den, der ringer op og hævde, at den ikke er den samme som din:

if (getClass().getPackage().equals(MyBaseClass.class.getPackage())
    throw new IllegalAccessError(); // or similar

FYI getClass() giver dig klassen this , som ville underklassens klasse.

Redigeret:

For at finde den, der ringer, skal du bruge denne kode:

Class<?> callerClass = Class.forName(Thread.currentThread().getStackTrace()[2].getClassName());

Java tag