繁体   English   中英

如何在 Scala 中使用 Java 注释?

[英]How can I use a Java Annotation in Scala?

我有一个自定义 Java 注释,它在编译测试源时生成一个文件。 但是当我将此注释导入 Scala class 并以与 Java 中相同的方式使用它时,Z3012DCFF1477E1FEAZ8 不是处理它。

Java注解

@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Trace {
    public String key() default "";
    public byte step() default 0;
    public String url() default "";
}

@SupportedAnnotationTypes("com.custom.annotations.Trace")
@SupportedSourceVersion(SourceVersion.RELEASE_6)
@AutoService(Processor.class)
public class TraceProcessor extends AbstractProcessor {

    public static final String DEFAULT_FILE_PATH = "target/";
    public static final String DEFAULT_FILE_NAME = "trazability.txt";

    private Messager messager;

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        Set<? extends Element> annotatedElements = getTraceAnnotatedElements(roundEnv);
        if(annotatedElements.size() == 0) {
            return true; // If there is not annotation, fast exist.
        }

        System.out.println("Processing @Trace annotations...");
        try {
            generateTraceFile(annotatedElements);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return true;
    }

    @Override
    public void init(ProcessingEnvironment processingEnvironment) {
        super.init(processingEnvironment);

        // get messager for printing errors
        messager = processingEnvironment.getMessager();
    }

    private Set<? extends Element> getTraceAnnotatedElements(RoundEnvironment roundEnv) {
        return roundEnv.getElementsAnnotatedWith(Trace.class);
    }

    private void generateTraceFile(Set<? extends Element> annotatedElements) throws FileNotFoundException {
        PrintWriter out = new PrintWriter(DEFAULT_FILE_PATH + DEFAULT_FILE_NAME);

        System.out.println("Annotated elements with @Trace: " + annotatedElements.size());
        for (Element element : annotatedElements) {
            if (element.getKind() == ElementKind.CLASS || element.getKind() == ElementKind.METHOD) {
                String key = element.getAnnotation(Trace.class).key();
                int step = element.getAnnotation(Trace.class).step();

                if(element.getKind() == ElementKind.METHOD) {
                    String className = ((TypeElement) element.getEnclosingElement()).getQualifiedName().toString();
                    String methodName = element.getSimpleName().toString();
                    System.out.println("Add " + element.getKind().name() + " with key: " + key + " step: " + step + " class: " + className + " method: " + methodName);
                    out.print(key + ";" + step + ";" + className + "." + methodName);
                } else {
                    String packageName = ((Symbol) element).getQualifiedName().toString();
                    String className = packageName + "." + element.getSimpleName().toString();
                    System.out.println("Add " + element.getKind().name() + " with key: " + key + " step: " + step + " class: " + className);
                    out.print(key + ";" + step + ";" +  className);
                }
                out.println();
            }
        }
        out.println();
        out.close();
        System.out.println("File trazability generated into target folder");
    }

    private void printError(Element element, String message) {
        messager.printMessage(Diagnostic.Kind.ERROR, message, element);
    }

}

Scala

import com.custom.annotations.Trace

@Trace(key = "ECI-12")
class Simulation1 extends Simulation {}

当我将 java 注释用于 Java 源时,Trace 注释由 TraceProcessor 处理并生成一个文件。 但是当我对 Scala 做同样的事情时,它就不起作用了。

在 scala 代码中使用 java 注释会导致不可预知的结果,其中大多数根本不起作用。 请不要在您的 Scala 代码中使用它们,因为这样做会引起 Java 和 Scala 家伙的仇恨。 将 java 世界中您最喜欢的库与 scala 融合在一起不会为您带来从 scala 中获得的最佳效果,但会引发一系列在不同资源上很少考虑的问题。 Scala has its own ecosystem, and it is better to avoid using java libraries as long you can solve problem with scala library even if you super proficient with java.

Java 注释通常用于削减由 java 冗长的语法和糟糕的类型系统强制执行的样板文件。 Scala 拥有自己的元编程框架(黑盒宏、白盒宏、宏注释和隐式宏)和许多其他抽象的东西,例如具有 HKT 的强大类型系统和全能隐式搜索机制。 因此,在大多数情况下,您绝对不需要宏注释。

此外,对于您的问题,可能存在 scala 解决方案。 如果您决定描述问题而不是带来一堵代码墙,那么有人可以为您找到它。

Java 注释仅适用于 Java 编译器,因为处理器需要使用 Java AST。 您必须为 Scala 编写自己的宏注解,它使用与 Java 的注解处理器不兼容的编译器。 见这里: https://docs.scala-lang.org/overviews/macros/annotations.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM