2 votes

Quelle est la différence entre withEnclosingType() et withDeclaringType() dans InstrumentedType ?

Je suis un utilisateur expérimenté de Byte Buddy.

Quel effet pratique a InstrumentedType#withDeclaringType(TypeDescription) sur InstrumentedType#withEnclosingType(TypeDescription)? Quand est-ce que j'utilise l'un plutôt que l'autre?

0voto

Marcin Kłopotek Points 1190

Explorons les effets pratiques de chaque méthode et quand les utiliser.

  1. InstrumentedType#withDeclaringType(TypeDescription):
  • Effet Pratique: Cette méthode définit le type déclaratif du type instrumenté. Le type déclaratif est le type qui contient directement le type instrumenté, comme dans le cas des classes imbriquées.

  • Utilisation: Vous utiliseriez cette méthode lorsque vous souhaitez spécifier explicitement le type déclaratif exact du type instrumenté. Elle est généralement utilisée lors de la création ou de la modification de classes imbriquées, où le type déclaratif détermine la portée de la classe imbriquée dans la classe conteneur.

  1. InstrumentedType#withEnclosingType(TypeDescription):
  • Effet Pratique: Cette méthode définit le type d'encapsulation du type instrumenté. Le type d'encapsulation est le type qui enveloppe conceptuellement le type instrumenté, mais qui n'est peut-être pas son conteneur direct. Il représente la relation d'imbrication lexicale entre les types, notamment lorsqu'il s'agit de classes internes.

  • Utilisation: Vous utiliseriez cette méthode pour établir la relation d'imbrication lexicale entre les types, surtout dans le contexte des classes internes. Le type d'encapsulation représente la portée dans laquelle le type instrumenté est défini, permettant l'accès aux membres du type d'encapsulation.

En résumé, withDeclaringType() est utilisé pour définir explicitement le conteneur direct ou le type déclaratif du type instrumenté, tandis que withEnclosingType() établit la relation d'imbrication lexicale entre les types, notamment dans le cas des classes internes.

Lors du choix entre les deux méthodes, prenez en compte le contexte spécifique et les exigences de votre instrumentation. Si vous travaillez avec des classes imbriquées et avez besoin de spécifier le conteneur immédiat, utilisez withDeclaringType(). Si vous travaillez avec des classes internes et souhaitez établir la relation d'imbrication lexicale, utilisez withEnclosingType().

Vous pouvez en savoir plus sur les classes imbriquées vs internes pour obtenir un contexte plus large sur quand utiliser les deux méthodes :

Classe Interne:

  • Une classe interne statique est une classe imbriquée marquée comme static.
  • Elle n'est pas associée à une instance de la classe conteneur.
  • La classe interne statique n'a pas de référence à une instance de la classe conteneur.
  • Le type d'encapsulation et le type déclaratif sont les mêmes pour une classe interne statique.

Classe Imbriquée:

  • Une classe imbriquée non statique est une classe déclarée à l'intérieur d'une autre classe sans le mot-clé static.
  • Une classe interne est associée à une instance de la classe conteneur et a accès aux membres de l'instance de la classe conteneur (en utilisant this qualifié).
  • Le type d'encapsulation et le type déclaratif sont différents pour une classe interne.

0voto

raphw Points 6008

Les types anonymes auront un type englobant mais pas un type déclarant. Les types membres, en revanche, auront à la fois un type déclarant et un type englobant.

Vous pouvez consulter la classe DynamicType qui mappe ces attributs aux représentations Java au sein de son API de construction. Si vous créez un InstrumentedType manuellement, vous pouvez combiner les attributs comme vous le souhaitez, mais cela pourrait ne pas être pertinent pour l'API de réflexion Java.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X