La méthode Java Security Manager checkMemberAccess()
avait un paramètre contenant la classe à laquelle Reflection était appelée. Cette méthode était obsolète, avec une description disant d'utiliser plutôt checkPermission()
. Il n'y a pas de paramètres dans checkPermission()
qui soient similaires à ceux de checkMemberAccess()
.
Dans Security Manager, comment puis-je obtenir la classe cible Reflection sans la méthode checkMemberAccess()
?
c'est-à-dire si la classe A réfléchit à la classe B, je veux savoir que le target était la classe B.
Lorsque vous installez le gestionnaire de sécurité par défaut, l’application utilise ensuite la stratégie de sécurité par défaut. Si vous souhaitez fournir notre propre stratégie, vous pouvez le faire dans un fichier de stratégie écrit comme suit:
grant {
permission Java.lang.RuntimePermission "accessDeclaredMembers.{class name}";
permission Java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
CheckMemberAccess a une stratégie par défaut - pour autoriser l'accès aux membres PUBLIC, ainsi que l'accès aux classes ayant le même chargeur de classes que l'appelant. Dans tous les autres cas, cette méthode appelle checkPermission () avec l'autorisation RuntimePermission ("accessDeclaredMembers").
Pour les opérations de réflexion, utilisez une classe ReflectPermission et suppressAccessChecks qui permettent de supprimer les contrôles d'accès Java standard - pour les membres publics, d'accès par défaut (paquet), protégés et privés - effectués par des objets réfléchis à leur point d'utilisation .
Mais ceci est dangereux dans cette information (eventuellement confidentielle) et les méthodes normalement indisponibles seraient accessibles aux codes malicieux.
Une fois que vous avez fourni le fichier de stratégie, vous pouvez le vérifier comme suit:
try {
ReflectPermission permission = new ReflectPermission("suppressAccessChecks");
permission.checkGuard(null);
System.out.println("Permission granted");
} catch (SecurityException e) {
System.out.println("Permission denied");
}