标签: annotation-processing

Gradle弃用了lombok的注释处理器警告

升级到gradle 4.7后,我之前的无警告版本现在会发出此警告:

在编译类路径上检测到以下注释处理器:'lombok.launch.AnnotationProcessorHider $ AnnotationProcessor'和'lombok.launch.AnnotationProcessorHider $ ClaimingProcessor'.不推荐在编译类路径上检测注释处理器,Gradle 5.0将忽略它们.请将它们添加到注释处理器路径中.如果您不打算使用注释处理器,则可以使用'-proc:none'编译器参数来忽略它们.

似乎不推荐使用注释处理器,并且gradle版本5.0不支持注释处理器.

我的项目使用lombok,它需要处理注释处理器,因此使用-proc:none不是一种选择.当verison 5.0发布时,它们都不会停止使用Gradle.

我如何能:

  • 停止警告,并且
  • 确保我的项目将继续使用未来的Gradle版本构建?

java warnings gradle annotation-processing lombok

21
推荐指数
3
解决办法
1万
查看次数

使用注释处理器替换代码

我正在尝试编写一个注释处理器来在类上插入方法和字段......而且文档非常稀疏.我没有走得太远,我不知道我是否正确接近它.

处理环境提供了一个Filer对象,该对象具有用于创建新源和类文件的方便方法.那些工作正常,但后来我试图弄清楚如何读取现有的源文件,它提供的只是"getResource".所以在我的处理器实现中我做到了:

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
    try {
        for (TypeElement te : annotations) {
            for (Element element : roundEnv.getElementsAnnotatedWith(te)) {
                FileObject in_file = processingEnv.getFiler().getResource(
                    StandardLocation.SOURCE_PATH, "",
                    element.asType().toString().replace(".", "/") + ".java");

                FileObject out_file = processingEnv.getFiler().getResource(
                    StandardLocation.SOURCE_OUTPUT, "",
                    element.asType().toString().replace(".", "/") + ".java");

                //if (out_file.getLastModified() >= in_file.getLastModified()) continue;

                CharSequence data = in_file.getCharContent(false);

                data = transform(data); // run the macro processor

                JavaFileObject out_file2 = processingEnv.getFiler().createSourceFile(
                    element.asType().toString(), element);
                Writer w = out_file2.openWriter();
                w.append(data);
                w.close();
            } …
Run Code Online (Sandbox Code Playgroud)

java code-generation annotation-processing

20
推荐指数
1
解决办法
1万
查看次数

如何在注释处理中引用方法的实现?

我正在玩Java(javax)注释处理.

假设我有方法的注释:

@Target(ElementType.METHOD)
public @interface MethodAnnotation { }
Run Code Online (Sandbox Code Playgroud)

现在我想处理所有使用带注释的方法从类型中重写的方法:

interface MyInterface() {
    @MethodAnnotation
    void f()
}

class MyClass implements MyInterface {
    override void f() { } // <- I want to process this method
}
Run Code Online (Sandbox Code Playgroud)

@Inherited 元注释似乎不适合这里:

请注意,如果使用带注释的类型来注释除类之外的任何内容,则此元注释类型不起作用.

此外,是否可以处理未在子类中重写的继承类方法?像这样:

class MyClass {
    @MethodAnnotation
    void f() { }
}

class MySubClass extends MyClass { } // <- I want to process its f()
                                     //    or at least to find out that it doesn't
                                     //    override the method
Run Code Online (Sandbox Code Playgroud)

如何访问某个方法中的覆盖方法AbstractProcessor

我想,要实现这一点,我需要找到eclosing类的子类,但我还没有找到一种方法来做到这一点. …

java annotation-processing

20
推荐指数
1
解决办法
788
查看次数

注释处理器似乎打破了Java泛型

背景

我试图使用Annotation Processors来生成特定Factory接口的实现.这些接口看起来如下:

public interface ViewFactory<T extends View> {

    <S extends Presenter<T>> T create(S presenter);

}
Run Code Online (Sandbox Code Playgroud)

public interface PresenterFactory<T extends View> {

    <S extends Presenter<T>> S create();

}
Run Code Online (Sandbox Code Playgroud)

Annotation Processor正在执行正确的操作,并为每个匹配的类生成一个工厂,该工厂使用相应的注释进行注释.

问题

注释处理器的输出如下:

public final class TestViewImplFactory implements ViewFactory {

    public final TestView create(TestPresenter presenter) {
        return new TestViewImpl(presenter);
    }
}
Run Code Online (Sandbox Code Playgroud)

和相应的其他类:

public final class TestPresenterImplFactory implements PresenterFactory {

    public final TestPresenter create() {
        return new TestPresenterImpl();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,TestViewImplFactory无法编译.错误消息是:

"类'TestViewImplFactory'必须声明为abstract或在'ViewFactory'中实现抽象方法create(S)"

Java说,以下是正确的:

@Override
public View create(Presenter presenter) {
    return new …
Run Code Online (Sandbox Code Playgroud)

java generics annotations annotation-processing

20
推荐指数
1
解决办法
763
查看次数

如何从注释处理器生成kotlin文件?

我有一个java注释处理器,它在编译期间生成一堆java文件.我想通过添加扩展方法使生成的类更好地在kotlin中使用.我在kotlin论坛上被告知,我可以尝试的是写一个包含我的扩展功能的kotlin文件.我试过这个,我使用该Filer对象创建此文件,将其输出到StandardLocations.SOURCE_OUTPUT目录.Intellij可以看到我生成的类,我可以按预期使用扩展函数,但是app不会编译,因为编译器找不到新的kotlin文件.有什么方法可以编写一个新的kotlin文件,它将被kotlin编译器选中吗?

annotation-processing kotlin

19
推荐指数
1
解决办法
1257
查看次数

无法在注释处理器中加载资源(不在类路径上)

我有一个注释处理器,它将生成一个枚举,其中包含由接口的getter方法定义的键.

界面位于

MyProject的/ src目录/主/ JAVA/my.package.MyInterfaces.java.

我想验证驻留的属性文件,MyProject/src/main/resources/META-INF/resource-bundle/如果它们确实包含生成的枚举中定义的键.

我的问题是属性文件不能通过处理器的类加载器或Filer.getResource(...)获得.

  • 如何使该项目的源或类路径可供处理器使用,以便我可以加载属性文件?

  • 现在我只有处理器所在的jar中的资源可用.我尝试通过eclipse Project/Properties/Java编译器/ Annotation处理/处理器选项来定义-classpath和/或-sourcepath,但它没有成功.

有没有人遇到这样的问题,谁能给我一个关于如何为处理器提供资源的线索?

我确实有maven结构但不使用maven,因为应用程序中的旧依赖项.所以maven现在不适合我.

Eclipse 3.6 Helios似乎StandardLocation.SOURCE_PATH并且StandardLocation.CLASS_PATH没有在Filer#getResource()中实现,因此将生成的源文件或类文件写入SOURCE_PATHCLASS_PATH似乎不可能,同时访问任何文件SOURCE_PATHCLASS_PATH*

谢谢.

java eclipse annotation-processing

17
推荐指数
1
解决办法
2325
查看次数

IntelliJ和Gradle中的注释处理器

tl; dr:我无法配置IntelliJ来生成与gradle相同的目录中的java文件

我有一个使用immutables注释处理器的小项目.它在gradle命令行构建中按预期工作,但我无法让IntelliJ将生成的文件输出到同一目录.

整个项目可在GitLab上获得

Gradle配置:
我使用以下gradle插件:

  • gradle-idea插件,用于处理构思配置
  • gradle-apt-plugin,提供apt配置并处理与注释处理相关的编译类路径和构思配置(如果还应用了构思插件)

build-script的相关部分(链接到完整列表):

apply plugin: 'java'
apply plugin: "net.ltgt.apt"
apply plugin: 'idea'

dependencies {
    def immutablesVersion = '2.3.9'
    compileOnly "org.immutables:value:$immutablesVersion:annotations"
    compileOnly "org.immutables:encode:$immutablesVersion"
    apt "org.immutables:value:$immutablesVersion"
}
Run Code Online (Sandbox Code Playgroud)

当我开始时./gradlew build一切都如预期: 在此输入图像描述

  1. DataEncoding.java处理源文件,生成的java文件DataEncodingEnabled.java最终进入
  2. /build/generated/source/apt/main 根据预期的方案 com.tmtron.immutables.data
  3. 并且生成的文件也被编译为.class文件

在IntelliJ中,我按照gradle-apt-plugin文档的建议激活注释处理: 在此输入图像描述

然后我执行./gradlew clean以确保先前的文件已经消失然后我单击Build- Build Project在IntelliJ中.
执行注释处理器,但问题是生成的java文件最终位于错误的位置: 在此输入图像描述

它位于:/ build/generated/source/apt/main/build/generated/source/apt/main /com.tmtron.immutables.data
,粗体部分是多余的.

我做错了什么以及如何正确设置,以便IntelliJ和gradle在同一目录中生成文件?

笔记:

  • 我当然已经尝试将IntelliJ注释配置中的"生成源目录"留空,但是它不起作用:然后它会自动使用"生成"而我最终也会得到错误的路径.
  • IntelliJ版本2016.3.4

intellij-idea gradle annotation-processing

17
推荐指数
3
解决办法
1万
查看次数

如何减少React Native Android应用程序的启动时间

我目前正试图弄清楚如何减少Android启动时间.它不是iOS的问题,但对于Android,我看到的时间是6-10秒.目标是大约3-4秒.

以下是我遇到的研究摘要

  • createReactContext:反应桥初始化并开始加载所有本机模块
  • getMethodDescriptors:使用反射,它使用编译(运行时)所有公开方法的列表ReactMethod

解决方案存在但不完美:

  1. LazyReactPackage(实验性)https://github.com/facebook/react-native/commit/797ca6c219b2a44f88f10c61d91e8cc21e2f306e
  2. 删除所有公开的 https://github.com/facebook/react-native/pull/10084的反射ReactMethods

我对这些解决方案的问题在于使用注释处理来生成类(编译时).我试图找出如何让这些解决方案运行没有运气.

此外,围绕减少Android启动时间的其他建议也会有所帮助.

谢谢!

android startup gradle annotation-processing react-native

17
推荐指数
1
解决办法
949
查看次数

从Java Annotation Processor访问源代码

我试图从Java Annotation Processor中访问类型的实际原始源代码.这有可能吗?谢谢!

java annotations annotation-processing

16
推荐指数
3
解决办法
5842
查看次数

Java 1.8和IntelliJ IDEA 14中注释的编译错误

我正在玩Java注释处理.IntelliJ IDEA中的应用程序构建失败,而maven构建成功结束.我确信提供程序类存在,但我收到以下错误:

java: Bad service configuration file, or exception thrown while constructing Processor object: javax.annotation.processing.Processor: Provider <my class> not found.
Run Code Online (Sandbox Code Playgroud)

我想这是因为一个模块X,应该用-proc:none参数编译.但我需要为其余的应用程序启用注释处理.如何配置IntelliJ IDEA构建过程以在注释过程中跳过特定模块?

java settings intellij-idea annotation-processing

16
推荐指数
1
解决办法
7475
查看次数