2017-02-20 10 views
1

Есть ли способ предотвратить использование Byte Buddy значений по умолчанию для аннотаций, которые я добавил? Используя следующий пример, основанный на плагине сборки, я хотел бы видеть избыточные значения required и namespace, опущенные из полученного байткода для аннотации @XmlAttribute в поле baz.Могу ли я запретить Byte Buddy испускать значения по умолчанию для аннотаций?

Foo/Bar.java:

package foo; 

import javax.xml.bind.annotation.XmlAttribute; 

public class Bar { 
    @XmlAttribute(name = "qux") 
    public String qux; 
} 

сеть/bytebuddy/тест/SimplePlugin.java:

...  
public class SimplePlugin implements Plugin { 
...  
    @Override 
    public DynamicType.Builder<?> apply(DynamicType.Builder<?> builder, TypeDescription typeDescription) { 
     return builder.defineField("baz", String.class, Visibility.PUBLIC) 
      .annotateField(AnnotationDescription.Builder.ofType(XmlAttribute.class) 
       .define("name", "baz") 
       .build()); 
    } 
} 

Foo/Bar.class:

// 
// Source code recreated from a .class file by IntelliJ IDEA 
// (powered by Fernflower decompiler) 
// 

package foo; 

import javax.xml.bind.annotation.XmlAttribute; 

public class Bar { 
    @XmlAttribute(
     name = "qux" 
    ) 
    public String qux; 
    @XmlAttribute(
     name = "baz", 
     required = false, 
     namespace = "##default" 
    ) 
    public String baz; 

    public Bar() { 
    } 
} 

ответ

1

Byte Buddy может настраивается так, чтобы пропускать значения аннотации по умолчанию. Однако настройка Byte Buddy выходит за рамки плагина преобразования, который реализует интерфейс Plugin. Байт Buddy API предоставляет отдельный интерфейс EntryPoint, который может быть реализован для управления инициализацией Byte Buddy.

сеть/bytebuddy/тест/SimpleEntryPoint.java:

package net.bytebuddy.test; 

... 

public class SimpleEntryPoint implements EntryPoint { 
    @Override 
    public ByteBuddy getByteBuddy() { 
     return new ByteBuddy() 
      .with(AnnotationValueFilter.Default.SKIP_DEFAULTS); 
    } 

    ... 
} 

pom.xml:

... 
    <plugin> 
      <groupId>net.bytebuddy</groupId> 
      <artifactId>byte-buddy-maven-plugin</artifactId> 
      <executions> 
       <execution> 
        <goals> 
         <goal>transform</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <initialization> 
        <entryPoint>net.bytebuddy.test.SimpleEntryPoint</entryPoint> 
       </initialization> 
       <transformations> 
        <transformation> 
         <plugin>net.bytebuddy.test.SimplePlugin</plugin> 
        </transformation> 
       </transformations> 
      </configuration> 
     </plugin> 
... 

Foo/Bar.class:

// 
// Source code recreated from a .class file by IntelliJ IDEA 
// (powered by Fernflower decompiler) 
// 

package foo; 

import javax.xml.bind.annotation.XmlAttribute; 

public class Bar { 
    @XmlAttribute(
     name = "qux" 
    ) 
    public String qux; 
    @XmlAttribute(
     name = "baz" 
    ) 
    public String baz; 

    public Bar() { 
    } 
}