J'ai une classe qui utilise XML et la réflexion pour retourner Object
s à une autre classe.
Normalement, ces objets sont des sous-champs d'un objet externe, mais parfois c'est quelque chose que je veux générer à la volée. J'ai essayé quelque chose comme ça mais en vain. Je pense que c'est parce que Java ne vous permettra pas d'accéder aux private
méthodes de réflexion.
Element node = outerNode.item(0);
String methodName = node.getAttribute("method");
String objectName = node.getAttribute("object");
if ("SomeObject".equals(objectName))
object = someObject;
else
object = this;
method = object.getClass().getMethod(methodName, (Class[]) null);
Si la méthode fournie est private
, elle échoue avec un NoSuchMethodException
. Je pourrais le résoudre en créant la méthode public
, ou en créant une autre classe pour la dériver.
Bref, je me demandais simplement s'il y avait un moyen d'accéder à une private
méthode par réflexion.
la source
getDeclaredMethod()
au lieu de simplementgetMethod()
- cela ne fonctionnera pas pour les méthodes privées.private
accès jouant un rôle similaire.Utilisez
getDeclaredMethod()
pour obtenir un objet Method privé, puis utilisezmethod.setAccessible()
pour permettre de l'appeler réellement.la source
java.lang.StackOverflowError
si je n'appelle passetAccessible(true)
.Si la méthode accepte un type de données non primitif, la méthode suivante peut être utilisée pour appeler une méthode privée de n'importe quelle classe:
Les paramètres acceptés sont obj, methodName et les paramètres. Par exemple
La méthode concatString peut être appelée comme
la source
vous pouvez le faire en utilisant ReflectionTestUtils de Spring ( org.springframework.test.util.ReflectionTestUtils )
Exemple: si vous avez une classe avec une méthode privée
square(int x)
la source
Permettez-moi de fournir un code complet pour les méthodes protégées d'exécution via la réflexion. Il prend en charge tous les types de paramètres, y compris les génériques, les paramètres autoboxed et les valeurs nulles
La méthode utilise Apache ClassUtils pour vérifier la compatibilité des paramètres autoboxed
la source
Une autre variante utilise la très puissante bibliothèque JOOR https://github.com/jOOQ/jOOR
Il permet de modifier tous les champs comme les constantes statiques finales et d'appeler des méthodes protégées sans spécifier de classe concrète dans la hiérarchie d'héritage
la source
Vous pouvez utiliser @Jailbreak de Manifold pour une réflexion Java directe et sécurisée:
@Jailbreak
déverrouille lafoo
variable locale dans le compilateur pour un accès direct à tous les membres deFoo
la hiérarchie de.De même, vous pouvez utiliser la méthode d'extension jailbreak () pour une utilisation ponctuelle:
Grâce à la
jailbreak()
méthode, vous pouvez accéder à n'importe quel membre deFoo
la hiérarchie de.Dans les deux cas, le compilateur résout l'appel de méthode pour vous en toute sécurité, comme s'il s'agissait d'une méthode publique, tandis que Manifold génère un code de réflexion efficace pour vous sous le capot.
Sinon, si le type n'est pas connu de manière statique, vous pouvez utiliser le typage structurel pour définir une interface qu'un type peut satisfaire sans avoir à déclarer son implémentation. Cette stratégie maintient la sécurité de type et évite les problèmes de performances et d'identité associés à la réflexion et au code proxy.
En savoir plus sur Manifold .
la source