在InstrumentedType中,withEnclosingType()和withDeclaringType()之间的区别是什么?

huangapple go评论50阅读模式
英文:

What is the difference between withEnclosingType() and withDeclaringType() in InstrumentedType?

问题

InstrumentedType#withDeclaringType(TypeDescription)InstrumentedType#withEnclosingType(TypeDescription) 相比,它们有什么实际影响?在什么情况下我会使用其中一个而不是另一个?

英文:

I'm an experienced Byte Buddy user.

What practical effect does InstrumentedType#withDeclaringType(TypeDescription) have over InstrumentedType#withEnclosingType(TypeDescription)? When do I use one versus the other?

答案1

得分: 0

Sure, here is the translated content:

  1. InstrumentedType#withDeclaringType(TypeDescription):
  • 实际效果: 此方法设置了被代理类型的声明类型。声明类型是直接包含被代理类型的类型,就像嵌套类的情况一样。

  • 用法: 当您希望明确指定被代理类型的声明类型时,可以使用此方法。通常在创建或修改嵌套类时使用,其中声明类型确定了嵌套类在包含类中的范围。

  1. InstrumentedType#withEnclosingType(TypeDescription):
  • 实际效果: 此方法设置了被代理类型的封闭类型。封闭类型是在概念上封闭被代理类型的类型,但它可能不是其直接容器。它表示类型之间的词法嵌套关系,例如处理内部类时。

  • 用法: 当您希望在类型之间建立词法嵌套关系时,特别是在处理内部类的情况下,可以使用此方法。封闭类型表示定义被代理类型的范围,允许访问封闭类型的成员。

总之,withDeclaringType() 用于明确设置被代理类型的直接容器或声明类型,而 withEnclosingType() 用于建立类型之间的词法嵌套关系,特别是在内部类的情况下。

在选择这两种方法之间时,请考虑您的代理需求的具体上下文和要求。如果您处理嵌套类并且需要指定直接容器,请使用 withDeclaringType()。如果您使用内部类并且希望建立词法嵌套关系,请使用 withEnclosingType()

您可以阅读更多关于嵌套类与内部类的内容,以获取更广泛的上下文,了解何时使用这两种方法:

内部类:

  • 静态内部类是一个被标记为 static 的嵌套类。
  • 它不与封闭类的实例相关联。
  • 静态内部类没有对封闭类实例的引用。
  • 对于静态内部类,封闭类型和声明类型是相同的。

嵌套类:

  • 非静态嵌套类是在另一个类中声明而没有使用 static 关键字的类。
  • 内部类与封闭类的实例相关联,并可以访问封闭类的实例成员(使用限定的 this)。
  • 对于内部类,封闭类型和声明类型是不同的。
英文:

Let's explore each method's practical effects and when to use them.

  1. InstrumentedType#withDeclaringType(TypeDescription):
  • Practical Effect: This method sets the declaring type for the instrumented type. The declaring type is the type that directly contains the instrumented type, as in the case of nested classes.

  • Usage: You would use this method when you want to specify the exact declaring type of the instrumented type explicitly. It is typically used when creating or modifying nested classes, where the declaring type determines the scope of the nested class within the containing class.

  1. InstrumentedType#withEnclosingType(TypeDescription):
  • Practical Effect: This method sets the enclosing type for the instrumented type. The enclosing type is the type that conceptually encloses the instrumented type, but it may not be its direct container. It represents the lexical nesting relationship between types, such as when dealing with inner classes.

  • Usage: You would use this method when you want to establish the lexical nesting relationship between types, especially in the context of inner classes. The enclosing type represents the scope in which the instrumented type is defined, allowing access to the enclosing type's members.

In summary, withDeclaringType() is used to explicitly set the direct container or declaring type of the instrumented type, while withEnclosingType() establishes the lexical nesting relationship between types, particularly in the case of inner classes.

When choosing between the two methods, consider the specific context and requirements of your instrumentation. If you are dealing with nested classes and need to specify the immediate container, use withDeclaringType(). If you are working with inner classes and want to establish the lexical nesting relationship, use withEnclosingType().

You can read more about nested vs inner classes to get a wider context on when to use both methods:

Inner Class:

  • A static inner class is a nested class that is marked as static.
  • It is not associated with an instance of the enclosing class.
  • The static inner class does not have a reference to an instance of the enclosing class.
  • The enclosing type and the declaring type are the same for a static inner class.

Nested Class:

  • A non-static nested class, is a class declared within another class without the static keyword.

  • An inner class is associated with an instance of the enclosing class and has access to the instance members of the enclosing class (using qualified this).

  • The enclosing type and the declaring type are different for an inner class.

答案2

得分: 0

匿名类型将具有一个“封闭类型”但没有“声明类型”。另一方面,成员类型将同时具有“声明类型”和“封闭类型”。

您可以查看DynamicType类,它将这些属性映射到其构建器API中的Java表示。如果您手动创建一个InstrumentedType,您可以组合属性,但它们可能对Java反射API没有意义。

英文:

Anonymous types will have an enclosing type but not a declaring type. Member types on the other hand will have both a declaring type and an enclosing type.

You can check the DynamicType class which maps these attributes to the Java representations within its builder API. If you create an InstrumentedType manually, you can combine attributes like you want, but they might not make sense to the Java reflection API.

huangapple
  • 本文由 发表于 2023年6月1日 13:17:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/76378846.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定