java aspectj apt_java – 用于覆盖超类方法的AOP或APT

回答我自己的问题:

以下是插入超级调用的相关代码位:

private static Filer filer;

private static JavacProcessingEnvironment environment;

private static Messager messager;

private static Types types;

private static JavacElements elementUtils;

private Trees trees;

private TreeMaker treeMaker;

private IdentityHashMap compilationUnits;

private Map typeMap;

如果具有注释的AbstractBehavior的子类型不覆盖renderHead(response)方法,则调用此逻辑:

private void addMissingSuperCall(final TypeElement element){

final String className = element.getQualifiedName().toString();

final JCClassDecl classDeclaration =

// look up class declaration from a local map

this.findClassDeclarationForName(className);

if(classDeclaration == null){

this.error(element, "Can't find class declaration for " + className);

} else{

this.info(element, "Creating renderHead(response) method");

final JCTree extending = classDeclaration.extending;

if(extending != null){

final String p = extending.toString();

if(p.startsWith("com.myclient")){

// leave it alone, we'll edit the super class instead, if

// necessary

return;

} else{

// @formatter:off (turns off eclipse formatter if configured)

// define method parameter name

final com.sun.tools.javac.util.Name paramName =

elementUtils.getName("response");

// Create @Override annotation

final JCAnnotation overrideAnnotation =

this.treeMaker.Annotation(

Processor.buildTypeExpressionForClass(

this.treeMaker,

elementUtils,

Override.class

),

// with no annotation parameters

List. nil()

);

// public

final JCModifiers mods =

this.treeMaker.Modifiers(Flags.PUBLIC,

List.of(overrideAnnotation));

// parameters:(final IHeaderResponse response)

final List params =

List.of(this.treeMaker.VarDef(this.treeMaker.Modifiers(Flags.FINAL),

paramName,

Processor.buildTypeExpressionForClass(this.treeMaker,

elementUtils,

IHeaderResponse.class),

null));

//method return type: void

final JCExpression returnType =

this.treeMaker.TypeIdent(TypeTags.VOID);

// super.renderHead(response);

final List statements =

List. of(

// Execute this:

this.treeMaker.Exec(

// Create a Method call:

this.treeMaker.Apply(

// (no generic type arguments)

List. nil(),

// super.renderHead

this.treeMaker.Select(

this.treeMaker.Ident(

elementUtils.getName("super")

),

elementUtils.getName("renderHead")

),

// (response)

List. of(this.treeMaker.Ident(paramName)))

)

);

// build code block from statements

final JCBlock body = this.treeMaker.Block(0, statements);

// build method

final JCMethodDecl methodDef =

this.treeMaker.MethodDef(

// public

mods,

// renderHead

elementUtils.getName("renderHead"),

// void

returnType,

//

List. nil(),

// (final IHeaderResponse response)

params,

//

List. nil(),

// super.renderHead(response);

body,

//

null);

// add this method to the class tree

classDeclaration.defs =

classDeclaration.defs.append(methodDef);

// @formatter:on turn eclipse formatter on again

this.info(element,

"Created renderHead(response) method successfully");

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值