anchor.diff:  [[domain-specific-language-and-immutability]]
   === 领域特定语言和不变性
   
  +在看过 Byte Buddy 这种领域特定语言的实际效果之后，我们需要简要看一下这种语言的实现方式。有一个细节需要特别注意，这个语言是围绕 https://en.wikipedia.org/wiki/Immutable_object[不可变对象] 构建的。事实上，Byte Buddy 中，几乎所有的类都被构建成不可变的；极少数情况，我们不可能把对象构建成不可变的，我们会在该类的文档中明确指出。如果你为 Byte Buddy 实现自定义功能，我们建议你遵守此原则。
  +
  +作为所提到的不可变性的含义，例如配置 `ByteBuddy` 实例时，一定要小心。你也许会犯下面的错误：
  +
   [source,{java_source_attr}]
   ----
   ByteBuddy byteBuddy = new ByteBuddy();
  
positive.code:   private String bar$original() { return "bar"; }
  }
  ----
  
  
  [source,{java_source_attr}]
  ----
  
negative.code: DynamicType.Unloaded<?> dynamicType = byteBuddy.subclass(Object.class).make();
  ----
  
  你或许希望使用 `new NamingStrategy.SuffixingRandom("suffix")` 来自定义动态类型的命名策略。不是修改存储在 `byteBuddy` 变量中的实例，调用 `withNamingStrategy` 方法返回一个自定义的 `ByteBuddy` 实例，但是它却直接被丢弃了。结果，还是使用原来创建的默认配置来创建动态类型。
  
  [[redefining-and-rebasing-existing-classes]]
  === 重新定义或者重定基底已经存在的类
  
  [NOTE]
  ====
  *D瓜哥注*
  
  `type rebasing` 不知如何翻译是好，如果有好的翻译，欢迎给发PR。
  ====
  
  到目前为止，我们仅仅演示了如何使用 Byte Buddy 来创建已知类的子类。相同的 API 还可用于增强已有类。增加已有类有两种方式：
  
  类型重定义（type redefinition）::
  当重定义一个类时，Byte Buddy 可以对一个已有的类添加属性和方法，或者删除已经存在的方法实现。如果使用其他的方法实现替换已经存在的方法实现，则原来存在的方法实现就会消失。例如，我们重定义下面这个类型
  +
  [source,{java_source_attr}]
  ----
  class Foo {
    String bar() { return "bar"; }
  }
  ----
  +
  从 `bar` 方法返回 `"qux"`，那么该方法原来返回的 `"bar"` 等信息就会都被丢失掉。
  
  类型重定基底（type rebasing）::
  当重定基底一个类时，Byte Buddy 保存基底类所有方法的实现。当 Byte Buddy 如执行类型重定义时，它将所有这些方法实现复制到具有兼容签名的重新命名的私有方法中，而不是抛弃重写的方法。这样，就没有实现会被丢失。重定义的方法可以继续通过它们重命名过的名称调用原来的方法。通过这种方式，上述 `Foo` 类就会被重定义成下面这个样子：
  +
  [source,{java_source_attr}]
  ----
  class Foo {
  