java - 有什么办法可以用这种方式替换这段代码吗?

标签 java android android-annotations java-annotations

我正在尝试替换此代码:

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

由此

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

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

这可能吗?

最佳答案

这是绝对有可能的。 Project Lombok提供您正在寻找的确切功能。您只需要通过扩展 EclipseAnnotationHandler 创建自己的注释或 JavacAnnotationHandler取决于您的要求。

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

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

注释处理后

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

设置 Lombok 项目

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

关于java - 有什么办法可以用这种方式替换这段代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58880611/

相关文章:

java - 使用 DateTime 描述生日

java - 每个使用字段的方法中的同步块(synchronized block)

java - 无法为 Spring Jersey 应用程序创建自定义错误

java - 如何使用触摸监听器停用布局的 alpha "color"

java - 无法对数组元素求和?

android - 如何在google play中发布试用版应用并在一段时间后续费

java - Android 编程时 Eclipse 出现空指针异常

AndroidAnnotations + Instant App - 找不到生成的 <applicationId>.R 类

android - 在 Parceler 中使用 Android 注解

Android注解和单元测试