我正在尝试替换此代码:

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


这样

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


我看到了有关拦截器和注释的信息,但我做不到。

这可能吗?

最佳答案

绝对有可能。 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

07-24 09:49
查看更多