标签: annotation-processing

Java注释处理:我怎么知道一轮是最后一轮?

扩展时AbstractProcessor,有可能覆盖init(...),但没有"相反"的方法,在处理完所有轮次后调用.

这是一个问题:当你必须将每一轮收集的信息附加到同一个文件时,你就无法关闭文件,因为你永远不会知道最后一轮的时间.因此,文件永远不会关闭并保持为空.

使用关闭钩子也不起作用,永远不会调用钩子.

有任何想法吗?

java annotations annotation-processing shutdown-hook

12
推荐指数
1
解决办法
2179
查看次数

如何使用注释处理器检查整个源代码树?

我有很多处理特定消息类型的处理程序类.要注册所有这些处理程序,我需要知道存在哪些处理程序.目前,它们都使用特定的注释进行注释,并且我使用Java 6注释处理器来获取所有这些注释,并创建一个包含每个注释类型的实例的Register类.

如果整个树一次构建,这很有效,但如果只构建一个带注释的类(例如,当我在Eclipse中保存文件时),处理器只能看到该类型,并构建一个不完整的Register.如何检查此方案中的其他类型?

android dalvik annotation-processing

12
推荐指数
1
解决办法
643
查看次数

在eclipse中调试注释处理器

我正在编写一个简单的注释处理器并尝试使用eclipse进行调试.我为注释处理器创建了一个新项目,并根据需要在META-INF下配置了javax.annotation.processing.Processor,它可以很好地处理注释.

然后,我添加了一些代码并尝试调试,但永远不会在注释处理器中添加的断点处停止执行.我正在使用ant编译,我正在使用以下ANT选项.

export ANT_OPTS =" - Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = y,address = 8000"

在触发ant build之后,我将创建一个远程调试配置,调试器启动正常.Ant构建也成功启动.但是在注释处理器中添加的任何断点处执行都不会停止.

java eclipse ant remote-debugging annotation-processing

12
推荐指数
1
解决办法
3688
查看次数

Android上的Dagger 2,错过了错误消息

我在我的Android项目中使用Dagger 2,但我在调试时遇到问题.我知道编译失败是因为我的匕首2设置中的错误(以前有过)但是几乎不可能跟踪它,因为我没有得到正确的错误消息告诉我问题出在哪里.我得到的只是显示注释处理失败的消息.沿着:

Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.
Error:(14, 28) error: cannot find symbol class BR
Error:(17, 40) error: package com.some.package.databinding does not exist
Error:(17, 51) error: cannot find symbol class DaggerSomeComponent
...
Run Code Online (Sandbox Code Playgroud)

也许它与某些事实有关,我也在使用数据绑定!?

我正在使用Dagger 2.5,Gradle插件2.1.2和android-apt 1.8.

谢谢你的帮助!

android annotation-processing dagger-2 android-databinding kapt

12
推荐指数
1
解决办法
2169
查看次数

类型isAssignable和isSubtype误解

在使用Java 6 API编写注释处理器时,我遇到了以特定方式处理所有地图的需求,但我显然误解了API的目的或如何调用它.这是让我不开心的代码:

import javax.lang.model.element.Element;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import javax.annotation.processing.ProcessingEnvironment;
...

public String doThing(Element el, ProcessingEnvironment processingEnv) {
    // Utilities from the ProcessingEnvironment
    Types typeUtils = processingEnv.getTypeUtils();
    Elements elementUtils = processingEnv.getElementUtils();

    // The type of the element I'm handling
    TypeMirror elType = el.asType();

    // Compare the element's type to Map
    TypeMirror mapType = elementUtils.getTypeElement("java.util.Map").asType();

    System.out.println(elType + " > " + mapType + " = " + typeUtils.isSubtype(elType, mapType));
    System.out.println(mapType + " > " + elType + " …
Run Code Online (Sandbox Code Playgroud)

java annotation-processing

11
推荐指数
1
解决办法
1630
查看次数

maven中的注释处理器输出

我正在使用JSR 269作为在编译期间分析代码的方法,并在需要时将其失败.我在maven中显示我的注释处理器的输出时遇到了麻烦(Ant确实显示了输出)我正在使用javax.annotation.processing.Messager来显示警告和错误,但在maven中我没有看到它的输出.(我确实知道它会运行,因为它会产生类似它的代码).有任何想法吗?

java maven annotation-processing

11
推荐指数
2
解决办法
5102
查看次数

用于远程JAR的Java Annotation处理器

一般问题

我有两个项目A和B; B依赖于A.我想根据A中对象的注释在B中使用Annotation Processor生成一些代码.当我使用正确的Processor实现运行编译时,只会拾取B中带注释的对象.

我知道默认情况下必须禁用扫描其他JAR,因为您通常不希望对所有依赖项执行注释扫描.我也明白,由于编译器魔术可能无法做我想做的事 - 我不太了解 - 但我希望不是.

具体情况

我的项目称为DB和WEB.WEB显然依赖于DB的JPA访问; 这是在Maven中配置的.由于许多架构选择,DB必须保持独立的JAR.除了WEB使用的一些注释之外,DB不使用Spring; WEB使用Spring MVC.

我正在尝试CrudRepository使用Annotation Processor为我的所有JPA实体生成接口.这些@Repository对象应该repo放在WEB项目的包中,因此它们可以@Autowired在我的WEB应用程序中的任何地方使用.我正在执行扫描的注释是@javax.persistence.Entity,但我也尝试了自定义注释,结果相同.

@SupportedAnnotationTypes("javax.persistence.Entity")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class RepositoryFactory extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for (Element e : roundEnv.getElementsAnnotatedWith(Entity.class)) {
            if (e.getKind() != ElementKind.CLASS) {
                continue;
            }
            // TODO: implement logic to skip manually implemented Repos
            try {
                String name = e.getSimpleName().toString();
                TypeElement clazz = (TypeElement) e;

                JavaFileObject f = …
Run Code Online (Sandbox Code Playgroud)

java jpa maven annotation-processing javacompiler

11
推荐指数
2
解决办法
2562
查看次数

注释处理,RoundEnvironment.processingOver()

在Java中读取自定义注释处理器的代码时,我注意到处理器process方法中的这段代码:

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
  if (!roundEnv.errorRaised() && !roundEnv.processingOver()) {
    processRound(annotations, roundEnv);
  }
  return false;
}
Run Code Online (Sandbox Code Playgroud)

碰巧我正在使用自定义Annotation处理器,我想在我的注释处理器中使用上面的代码片段.

我用这种方式尝试了上面的代码:

if (!roundEnv.errorRaised() && !roundEnv.processingOver()) {
    processRound(annotations, roundEnv);
}
return false;
Run Code Online (Sandbox Code Playgroud)

& 这条路:

if (!roundEnv.errorRaised()) {
    processRound(annotations, roundEnv);
}
return false;
Run Code Online (Sandbox Code Playgroud)

但我没有注意到处理器行为的任何变化.我得到了!roundEnv.errorRaised()支票,但我看不出有!roundEnv.processingOver()什么用处.

我想知道roundEnv.processingOver()在处理某一轮时使用它的用例.

java annotation-processing java-annotations

11
推荐指数
1
解决办法
1316
查看次数

Dagger 找不到其他注解处理器生成的类

我编写了一个简单的 Annotation Processor(只是为了好玩),它将生成一些我在之前的项目中编写的样板代码。它实际上通过收集 Activity 类的注释来生成如下模块

@Module
abstract class ActivityInjectorModule {
  @ContributesAndroidInjector
  abstract fun providesMain2Activity(): Main2Activity

  @ContributesAndroidInjector
  abstract fun providesMainActivity(): MainActivity
}
Run Code Online (Sandbox Code Playgroud)

但是,当我使用 dagger 运行它时,dagger 似乎无法找到我的 annotation processor 生成的类。虽然生成了类并存在于生成的目录中,但我可以在我的源代码中使用它,但是在编译时,dagger 会产生以下异常。有什么专家建议吗?

error: cannot find symbol
@dagger.Component(modules = {dagger.android.AndroidInjectionModule.class, com.mallaudin.daggietest.di.AppModule.class, ActivityInjectorModule.class})
                                                                                                                       ^
  symbol: class ActivityInjectorModule
Run Code Online (Sandbox Code Playgroud)

这是主要的应用程序组件。

@Singleton
@Component(
    modules = [
        AndroidInjectionModule::class,
        AppModule::class,
        ActivityInjectorModule::class
    ]
)
interface AppComponent : AndroidInjector<App> {


    @Component.Builder
    interface Builder {

        fun addContext(@BindsInstance ctx: Context): Builder

        fun build(): AppComponent
    }
}
Run Code Online (Sandbox Code Playgroud)

ActivityInjectorModule类由注解处理器生成,存在于生成目录中。

应用类

class App : …
Run Code Online (Sandbox Code Playgroud)

java android annotation-processing dagger-2 annotation-processor

11
推荐指数
2
解决办法
2321
查看次数

如何使我自己的注释处理器增量?

我创建了一个名为EasyPrefs的注释处理器,当我尝试在我的项目中使用它时,它显示以下警告。

请求了增量注释处理,但由于以下处理器不是增量的,因此支持被禁用:net.androidcart.easyprefs.EasyPrefsProcessor (NON_INCREMENTAL)。

我做了一些研究,但找不到任何关于如何使其增量的教程。是否需要任何 Gradle 配置,或者需要覆盖某些功能等。

android gradle annotation-processing

10
推荐指数
1
解决办法
968
查看次数