有什么办法可以替换这种代码吗?

时间:2019-11-15 15:57:08

标签: java android android-annotations java-annotations

我正在尝试替换此代码:

nil

以此

input = input[/str|con|dex|wis|int|cha/] || ''

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

这可能吗?

1 个答案:

答案 0 :(得分:0)

这是绝对可能的。 Project Lombok提供您想要的确切功能。您只需根据需要扩展EclipseAnnotationHandlerJavacAnnotationHandler来创建自己的注释。

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

@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