Java 字节伙伴(字节码操纵)拦截器不工作:无

Java 字节伙伴(字节码操纵)拦截器不工作:无,java,java-7,bytecode-manipulation,byte-buddy,Java,Java 7,Bytecode Manipulation,Byte Buddy,我必须将注释XmlElementWrapper和XmlElement添加到列表类型的字段中,但这些注释需要名称。我想将属性名设置为字段名。 我有: newbytebuddy() .重新定义(类名) .method(ElementMatchers.isGetter()和(ElementMatchers.nameStartsWith(“get”)) .intercept(MethodDelegation.to(SetterListInterceptor.class)) .make(); //保存在.

我必须将注释XmlElementWrapper和XmlElement添加到列表类型的字段中,但这些注释需要名称。我想将属性名设置为字段名。 我有:

newbytebuddy()
.重新定义(类名)
.method(ElementMatchers.isGetter()和(ElementMatchers.nameStartsWith(“get”))
.intercept(MethodDelegation.to(SetterListInterceptor.class))
.make();
//保存在.class文件中(覆盖)
List setFields=SetterListInterceptor.get_fieldsList();
用于(字符串字段:设置字段){
新的ByteBuddy(ClassFileVersion.JAVA_V7)
.重新定义(类名)
.field(ElementMatchers.named(field))
.AnnotationField(AnnotationDescription.Builder.ofType(XmlElementWrapper.class)。定义(“名称”、“包装器”+字段)。build(),
AnnotationDescription.Builder.ofType(xmlement.class).define(“name”,“element”+field.build())
).make()
.saveIn(_outputDirectory.getParent().toFile());
}
这是我的拦截器:

public class SetterListInterceptor {

    public static final String GET_SIGNATURE = "get";
    //questa è la lista delle proprietà di tipo java.util.List' trovate nella classe in oggetto (una istanza di questa classe per classe)
    private static List<String> _fieldsList = new LinkedList<>();


    public static void getter(@Origin Method m) {
        String mname = m.getName();
        if (m.getReturnType().getCanonicalName().equals("java.util.List")) {
            String fieldname = mname.substring(mname.indexOf(GET_SIGNATURE) + 3);
            _fieldsList.add(fieldname);
        }
    }


    public static List<String> get_fieldsList() {
        List<String> temp = new LinkedList<>();
        temp.addAll(_fieldsList);
        _fieldsList = new LinkedList<>();
        return temp;
    }
}
公共类SetterListInterceptor{
公共静态最终字符串GET_SIGNATURE=“GET”;
//在oggetto的trovate nella classe中,java.util.List的属性列表(每个类的属性列表)
私有静态列表_fieldsList=新链接列表();
公共静态void getter(@Origin方法m){
字符串mname=m.getName();
if(m.getReturnType().getCanonicalName().equals(“java.util.List”)){
String fieldname=mname.substring(mname.indexOf(GET_SIGNATURE)+3);
_fieldsList.add(字段名);
}
}
公共静态列表get_fieldsList(){
List temp=new LinkedList();
临时添加所有(现场列表);
_fieldsList=新的LinkedList();
返回温度;
}
}
这是目标类的一部分:

package drift.drift.thrift.api.sigs534;

@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.11.0)", date = "2018-06-18")
public class tTOPR implements org.apache.thrift.TBase<tTOPR, tTOPR._Fields>, java.io.Serializable, Cloneable, Comparable<tTOPR> {
  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("tTOPR");

  private static final org.apache.thrift.protocol.TField CDIPAPP_FIELD_DESC = new org.apache.thrift.protocol.TField("CDIPAPP", org.apache.thrift.protocol.TType.I64, (short)1);
  private static final org.apache.thrift.protocol.TField COPR_FIELD_DESC = new org.apache.thrift.protocol.TField("COPR", org.apache.thrift.protocol.TType.STRING, (short)2);
  private static final org.apache.thrift.protocol.TField CTERATT_FIELD_DESC = new org.apache.thrift.protocol.TField("CTERATT", org.apache.thrift.protocol.TType.STRING, (short)3);
  private static final org.apache.thrift.protocol.TField CUBS_FIELD_DESC = new org.apache.thrift.protocol.TField("CUBS", org.apache.thrift.protocol.TType.STRING, (short)4);
  private static final org.apache.thrift.protocol.TField DSESATT_FIELD_DESC = new org.apache.thrift.protocol.TField("DSESATT", org.apache.thrift.protocol.TType.STRING, (short)5);
  private static final org.apache.thrift.protocol.TField SAZILST_FIELD_DESC = new org.apache.thrift.protocol.TField("SAZILST", org.apache.thrift.protocol.TType.STRING, (short)6);
  private static final org.apache.thrift.protocol.TField XOPR_FIELD_DESC = new org.apache.thrift.protocol.TField("XOPR", org.apache.thrift.protocol.TType.STRING, (short)7);
  private static final org.apache.thrift.protocol.TField XSTT_FIELD_DESC = new org.apache.thrift.protocol.TField("XSTT", org.apache.thrift.protocol.TType.STRING, (short)8);

  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new tTOPRStandardSchemeFactory();
  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new tTOPRTupleSchemeFactory();

  public long CDIPAPP; // optional
  public java.lang.String COPR; // optional
  public java.lang.String CTERATT; // optional
  public java.lang.String CUBS; // optional
  public java.lang.String DSESATT; // optional
  public java.lang.String SAZILST; // optional
  public java.lang.String XOPR; // optional
  public java.lang.String XSTT; // optional

  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
  public enum _Fields implements org.apache.thrift.TFieldIdEnum {
...
}
....
..
  private static class tTOPRStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
    public tTOPRStandardScheme getScheme() {
      return new tTOPRStandardScheme();
    }
  }
..
..
}
package drift.drift.thrift.api.sigs534;
@SuppressWarnings({“强制转换”、“原始类型”、“串行”、“未选中”、“未使用”})
@javax.annotation.Generated(value=“由Thrift编译器自动生成(0.11.0)”,date=“2018-06-18”)
公共类tTOPR实现org.apache.thrift.TBase、java.io.Serializable、Cloneable、Comparable{
私有静态final org.apache.thrift.protocol.TStruct STRUCT_DESC=new org.apache.thrift.protocol.TStruct(“tTOPR”);
私有静态最终org.apache.thrift.protocol.TField CDIPAPP_FIELD_DESC=new org.apache.thrift.protocol.TField(“CDIPAPP”,org.apache.thrift.protocol.TType.I64,(短)1);
私有静态final org.apache.thrift.protocol.TField COPR_FIELD_DESC=new org.apache.thrift.protocol.TField(“COPR”,org.apache.thrift.protocol.TType.STRING,(短)2);
私有静态final org.apache.thrift.protocol.TField cteatt_FIELD_DESC=new org.apache.thrift.protocol.TField(“cteatt”,org.apache.thrift.protocol.TType.STRING,(短)3);
private static final org.apache.thrift.protocol.TField CUBS_FIELD_DESC=new org.apache.thrift.protocol.TField(“CUBS”,org.apache.thrift.protocol.TType.STRING,(短)4);
私有静态final org.apache.thrift.protocol.TField DSESATT_FIELD_DESC=new org.apache.thrift.protocol.TField(“DSESATT”,org.apache.thrift.protocol.TType.STRING,(短)5);
私有静态final org.apache.thrift.protocol.TField SAZILST_FIELD_DESC=new org.apache.thrift.protocol.TField(“SAZILST”,org.apache.thrift.protocol.TType.STRING,(短)6);
private static final org.apache.thrift.protocol.TField XOPR_FIELD_DESC=new org.apache.thrift.protocol.TField(“XOPR”,org.apache.thrift.protocol.TType.STRING,(短)7);
私有静态final org.apache.thrift.protocol.TField XSTT_FIELD_DESC=new org.apache.thrift.protocol.TField(“XSTT”,org.apache.thrift.protocol.TType.STRING,(短)8);
private static final org.apache.thrift.scheme.SchemeFactory STANDARD_scheme_FACTORY=new tTOPRStandardSchemeFactory();
private static final org.apache.thrift.scheme.SchemeFactory TUPLE_scheme_FACTORY=new tTOPRTupleSchemeFactory();
公共长CDIPAPP;//可选
public java.lang.String COPR;//可选
public java.lang.String字符att;//可选
public java.lang.String CUBS;//可选
public java.lang.String DSESATT;//可选
public java.lang.String SAZILST;//可选
public java.lang.String XOPR;//可选
public java.lang.String XSTT;//可选
/**此结构包含的字段集,以及查找和操作这些字段的方便方法*/
公共枚举字段实现org.apache.thrift.TFieldIdEnum{
...
}
....
..
私有静态类tTOPRStandardSchemeFactory实现org.apache.thrift.scheme.SchemeFactory{
公共TTOPRS标准方案getScheme(){
返回新的tTOPRStandardScheme();
}
}
..
..
}
但我有一个例外:

没有[public static void factory.framework.settersistinerceptor.getter(java.lang.reflect.Method)、public static java.util.List factory.framework.settersistinerceptor.get_fieldsList()]允许从public drift.drift.thrift.api.sigs534.tTOPR$tTOPRStandardScheme drift.drift.thrift.api.sigs534.tTOPR$tTOPRStandardSchemeFactory.getScheme()->[Help 1]

怎么了? 任何解决方案都值得赞赏

抱歉,类名“SetterInterceptor”错误,我必须重命名为GetterInterceptor(不要混淆) 多谢各位


Roby

您的getter拦截器返回
void
,而被截获的方法应该返回一个值。因此,Byte Buddy不会映射这些方法

package drift.drift.thrift.api.sigs534;

@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.11.0)", date = "2018-06-18")
public class tTOPR implements org.apache.thrift.TBase<tTOPR, tTOPR._Fields>, java.io.Serializable, Cloneable, Comparable<tTOPR> {
  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("tTOPR");

  private static final org.apache.thrift.protocol.TField CDIPAPP_FIELD_DESC = new org.apache.thrift.protocol.TField("CDIPAPP", org.apache.thrift.protocol.TType.I64, (short)1);
  private static final org.apache.thrift.protocol.TField COPR_FIELD_DESC = new org.apache.thrift.protocol.TField("COPR", org.apache.thrift.protocol.TType.STRING, (short)2);
  private static final org.apache.thrift.protocol.TField CTERATT_FIELD_DESC = new org.apache.thrift.protocol.TField("CTERATT", org.apache.thrift.protocol.TType.STRING, (short)3);
  private static final org.apache.thrift.protocol.TField CUBS_FIELD_DESC = new org.apache.thrift.protocol.TField("CUBS", org.apache.thrift.protocol.TType.STRING, (short)4);
  private static final org.apache.thrift.protocol.TField DSESATT_FIELD_DESC = new org.apache.thrift.protocol.TField("DSESATT", org.apache.thrift.protocol.TType.STRING, (short)5);
  private static final org.apache.thrift.protocol.TField SAZILST_FIELD_DESC = new org.apache.thrift.protocol.TField("SAZILST", org.apache.thrift.protocol.TType.STRING, (short)6);
  private static final org.apache.thrift.protocol.TField XOPR_FIELD_DESC = new org.apache.thrift.protocol.TField("XOPR", org.apache.thrift.protocol.TType.STRING, (short)7);
  private static final org.apache.thrift.protocol.TField XSTT_FIELD_DESC = new org.apache.thrift.protocol.TField("XSTT", org.apache.thrift.protocol.TType.STRING, (short)8);

  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new tTOPRStandardSchemeFactory();
  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new tTOPRTupleSchemeFactory();

  public long CDIPAPP; // optional
  public java.lang.String COPR; // optional
  public java.lang.String CTERATT; // optional
  public java.lang.String CUBS; // optional
  public java.lang.String DSESATT; // optional
  public java.lang.String SAZILST; // optional
  public java.lang.String XOPR; // optional
  public java.lang.String XSTT; // optional

  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
  public enum _Fields implements org.apache.thrift.TFieldIdEnum {
...
}
....
..
  private static class tTOPRStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
    public tTOPRStandardScheme getScheme() {
      return new tTOPRStandardScheme();
    }
  }
..
..
}