【问题标题】:is there any way of replace this code of this way?有没有办法以这种方式替换此代码?
【发布时间】:2020-03-11 19:38:44
【问题描述】:

我正在尝试替换此代码:

public void doThing(){
    if(User.getInstance().isLoggin()){
    .....
    }
}

通过这个

@withUser
public void doThing(){
    ....
}

我看到了拦截器和注解,但我做不到。

这可能吗?

【问题讨论】:

    标签: java android android-annotations java-annotations


    【解决方案1】:

    绝对有可能。 Project Lombok 提供您正在寻找的确切功能。您只需要根据您的要求扩展EclipseAnnotationHandlerJavacAnnotationHandler 来创建自己的注释。

    下面给出了一个示例注释处理程序 (WithUser) 以供参考。如果在方法上使用,整个方法将被if(false){...} 块包围。将 false 替换为您自己在 Handler 上的表达式 (HandleWithUser.java)。

    @WithUser
    public void doThing(){
        System.out.println("Hello World");
    }
    

    标注处理后

    public void doThing(){
        if (false){
            System.out.println("Hello World");
        }
    }
    

    设置龙目岛项目

    git clone https://github.com/rzwitserloot/lombok.git
    cd lombok
    ant eclipse
    

    在 Eclipse 上打开 Lombok 项目并创建以下文件。

    WithUser.java

    package lombok;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
    @Retention(RetentionPolicy.SOURCE)
    public @interface WithUser {    
    }
    

    HandleWithUser.java

    package lombok.javac.handlers;
    
    import static lombok.javac.handlers.JavacHandlerUtil.setGeneratedBy;
    import org.eclipse.jdt.internal.compiler.ast.ASTNode;
    import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
    import org.eclipse.jdt.internal.compiler.ast.Annotation;
    import org.eclipse.jdt.internal.compiler.ast.IfStatement;
    import org.eclipse.jdt.internal.compiler.ast.Statement;
    import org.mangosdk.spi.ProviderFor;
    import com.sun.tools.javac.tree.JCTree;
    import com.sun.tools.javac.tree.JCTree.JCAnnotation;
    import com.sun.tools.javac.tree.JCTree.JCIf;
    import com.sun.tools.javac.tree.JCTree.JCLiteral;
    import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
    import com.sun.tools.javac.tree.JCTree.JCStatement;
    import com.sun.tools.javac.util.Context;
    import com.sun.tools.javac.util.List;
    import org.eclipse.jdt.internal.compiler.ast.FalseLiteral;
    import lombok.WithUser;
    import lombok.core.AnnotationValues;
    import lombok.javac.JavacAnnotationHandler;
    import lombok.javac.JavacNode;
    import lombok.javac.JavacTreeMaker;
    
    @ProviderFor(JavacAnnotationHandler.class)
    public class HandleWithUser extends JavacAnnotationHandler<WithUser>{
    
        @Override
        public void handle(AnnotationValues<WithUser> annotationValues, JCAnnotation ast, JavacNode annotationNode) {
            JavacNode annotation = annotationNode.up();
            JCMethodDecl method = (JCMethodDecl)annotation.get();
            List<JCStatement> contents = (List<JCStatement>) method.body.stats;
            JCTree source = annotation.get();
            JavacTreeMaker maker = annotationNode.getTreeMaker();
            JCLiteral falseLiteral = maker.Literal(false);
            JCIf ifStatement = maker.If(falseLiteral, maker.Block(0, contents), null);
            Context context = annotationNode.getContext();
            JCStatement ifBlock = setGeneratedBy(ifStatement, source, context);
            method.body.stats = List.of(ifBlock);
            annotation.rebuild();
        }
    
    }
    

    生成 lombok.jar

    ant dist
    

    测试

    确保在类路径中包含 lombok.jar

    javac -cp lombok.jar Test.java
    

    欲了解更多信息,请访问https://projectlombok.org/contributing/contributing

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 2021-07-21
      • 2023-04-04
      • 2014-12-28
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      相关资源
      最近更新 更多