标签: annotation-processing

如何从javac插件中获取MemberSelectTree中表达式的类型?

我试图用JSR 269格式编写一个注释处理器,它使用javac的Compiler Tree API来做一些源代码分析.我对成员选择表达式感兴趣,例如方法调用.

我可以很容易地获得所选方法(或字段等)的名称.但我想知道该成员的选择类型,我似乎无法找到一种直接的方法来做到这一点.Trees.getTypeMirror返回null我尝试调用的所有内容(而Javadoc没有提示).

我想我可以详尽地分析每一种表达对成员的左侧选择,并通过回归分析确定的静态类型的表达式:NewClassTree,TypeCastTree,MethodInvocationTree,ArrayAccessTree,和其他许多人.但这似乎是很容易出错的工作,显然javac已经知道表达式的静态类型,因为它需要这些信息用于许多目的.但是如何访问此类型信息?

到目前为止我所拥有的:

import com.sun.source.tree.MemberSelectTree;
import com.sun.source.tree.MethodInvocationTree;
import com.sun.source.util.TreePath;
import com.sun.source.util.TreePathScanner;
import com.sun.source.util.Trees;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
@SupportedAnnotationTypes("*")
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class PublicProcessor extends AbstractProcessor {
    public @Override boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for (Element e : roundEnv.getRootElements()) {
            final Trees trees = Trees.instance(processingEnv);
            final TreePath root = trees.getPath(e);
            new …
Run Code Online (Sandbox Code Playgroud)

java javac annotation-processing

5
推荐指数
1
解决办法
1911
查看次数

如何从TypeMirror对象获取类型描述符(JNI样式)字符串(注释处理)

我想要一个像这样的字符串:

Ljava/lang/Class;.getName()Ljava/lang/String;
Run Code Online (Sandbox Code Playgroud)

(JNI样式类型/方法描述,或称为类型描述符)

javax.lang.model.type.TypeMirror物体中的一个AnnotationProcessor。是否有任何便利方法或库可以解析TypeMirror对象并生成类似上述的String?

我想使用String org.objectweb.asm.Type从类型描述符字符串构造一个 对象。

java java-native-interface typedescriptor annotation-processing

5
推荐指数
1
解决办法
359
查看次数

Gradle + AndroidAnnotations会产生重复的类错误 - 需要在每次构建之前清理项目

我在使用gradle构建将IntelliJ IDEA项目迁移到Android Studio时遇到问题.我已经设置了AndroidAnnotations库,就像其他各种帖子中推荐的一样,它工作得很好.但是,当多次编译我的项目而不执行:clean其间的任务时,我收到以下错误消息:

/project-dir/build/source/apt_generated/flavor1/release/com/example/app/MyActivity_.java:15: error: duplicate class: com.example.app.MyActivity_

[more errors here...]
Run Code Online (Sandbox Code Playgroud)

我相信系列中的多个构建失败,因为AndroidAnnotations *_.java总是在:compile任务之前重新创建文件(不检查是否有必要)和:compile任务识别新文件(例如使用时间戳)但已经将它们作为预编译*.class文件找到因此抛出错误.这可能吗?我该如何防止这种行为?我可以为AndroidAnnotations添加必要性检查吗?或者这是另一个问题吗?


更新1:似乎从AndroidAnnotations本身抛出错误,因为:compile我删除时会起作用*.javaapt_generated手动文件夹内的文件时工作.


更新2:

我删除了以下一行 build.gradle:

// Automatically add the generated source code to the source set
android.sourceSets[getSourceSetName(variant)].java.srcDirs += aptOutput
Run Code Online (Sandbox Code Playgroud)

我不知道为什么没有这条线就行.由于我没有使用Android Studio添加文件夹Mark Directory as > Sources Root.可能这是缓存的一些结果?或者gradle以某种方式将我生成的java文件自动添加到类路径中?

尽管如此,我还是会感谢任何评论.


更新3 /解决方案

删除行并将gradle构建文件与Android Studio同步后,自动生成的源代码将作为源根删除,从而导致IDE显示缺少类的错误.

最终,我在Android Annotations github问题上找到了解决方案:https://github.com/excilys/androidannotations/issues/676

我重新添加了将其添加到源集的语句(允许Android Studio将其显示为源根).此外,我使用以下方法从变种源集合中删除了文件:

variant.javaCompile.source = variant.javaCompile.source.filter { p ->
    return !p.getPath().startsWith(aptOutputDir.getPath())
}
Run Code Online (Sandbox Code Playgroud)

现在识别生成的文件,并且重复的类错误消失了.

最好的问候,大卫 …

android gradle annotation-processing android-annotations android-studio

5
推荐指数
1
解决办法
2678
查看次数

如何使用Java 7和Maven在Eclipse Kepler中运行JSR269 annotaion处理器

我正在使用eclipse Kepler并且编译器设置为使用Java 7.我的类路径中有一个JSR269兼容的注释处理器(在maven容器中).

运行此注释处理器的最简单方法是什么?

实际上我希望Eclipse编译在构建期间自动运行这个注释处理器,因为它符合JSR 269 - 但事实并非如此.为什么不 - 是出于性能原因?

注意:命令行中的maven构建工作正常.

经过一些研究后发现,这可以在项目属性(Java编译器 - 注释处理 - 工厂路径)中进行配置.这里的问题是我当然想要使用已经在类路径上的注释处理器的.jar文件(在Maven容器中).我怎么能参考呢?我发现没有办法做到这一点.

我想出的最好的方法是使用M2_REPO变量,然后手动将路径附加到处理器,如下所示:

M2_REPO/com/gwtplatform/gwtp-processors/1.0.1/gwtp-processors-1.0.1.jar
Run Code Online (Sandbox Code Playgroud)

这显然存在处理器现在在2个地方指定的问题:在maven pom文件和eclipse项目中.怎么避免这个?

java eclipse maven annotation-processing m2e

5
推荐指数
1
解决办法
1130
查看次数

如何在不使用javac编译源代码的情况下运行注释处理器(Java 8不能使用Apt)

如何在不使用javac编译源代码的情况下运行注释处理器(Java 8不能使用Apt)?

是否有任何javac参数只能运行注释处理而不编译所有文件?

我想通过javac做什么:

  • 只需找到带注释的元素并使用-processor标志使用定义的注释处理器处理它们

  • 千万不能编译没有任何注解的源

因为我想在Java 8上执行此操作,所以无法使用Apt执行此任务?或许它是?

java annotations javac annotation-processing java-8

5
推荐指数
1
解决办法
1753
查看次数

如何在Java项目上的IntelliJ中使用Dagger2

我想用DaggerIntelliJ但不能用。Dagger使用注释处理器,我猜IntelliJ不了解注释处理器。

您可以看到生成的Java文件,它是由Dagger2编译器生成的,但是我的Java源代码找不到它们。即使我设置build.gradle为在我的Java文件和生成的Java文件之间连接。

这是我的整个源项目文件

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
}

def generatedSources = "$buildDir/generated/src"
def generatedOutputDir = file("$generatedSources")

compileJava {
    doFirst {
        generatedOutputDir.exists() || generatedOutputDir.mkdirs()
        options.compilerArgs = [
                '-s', "${generatedSources}"
        ]
    }
}

sourceSets {
    main {
        java {
            srcDirs += generatedOutputDir
        }
    }
}

dependencies {
    compile "com.google.dagger:dagger:2.0"
    compile "com.google.dagger:dagger-compiler:2.0"
    compile "com.squareup:otto:1.3.8"
    compile 'io.reactivex:rxjava:1.0.13'
    compile "org.glassfish:javax.annotation:10.0-b28"

    testCompile "junit:junit:4.12"
    testCompile "org.mockito:mockito-core:1.9.5"
}

compileJava.dependsOn clean
Run Code Online (Sandbox Code Playgroud)

java intellij-idea gradle annotation-processing dagger

5
推荐指数
1
解决办法
1804
查看次数

如何从ExecutableElement获取方法主体

在我的帮助下,AbstractProcessor我可以从带有某些注释的类中获取所有方法,我创建了:

List<? extends Element> allElements = processingEnv.getElementUtils().getAllMembers((TypeElement) bean);
List<ExecutableElement> methods = ElementFilter.methodsIn(allElements);
Run Code Online (Sandbox Code Playgroud)

是否可以获取方法的主体ExecutableElement?该API似乎只处理签名和修饰符。

我可能会使用以下答案的一些变体:https : //stackoverflow.com/a/34568708/6095334,以从专有* .sun。**包访问类,例如com.sun.tools.javac.tree.JCTree$MethodTree

MethodTree methodTree = trees.getTree(executableElement);
Run Code Online (Sandbox Code Playgroud)

这样,AbstractProcessor的init()方法treescom.sun.source.util.Treesset 的实例在哪里:trees = Trees.instance(processingEnv);
但是这些类带有警告:这不是任何受支持的API的一部分。如果编写依赖于此的代码,则后果自负。该代码及其内部接口如有更改或删除,恕不另行通知。

我希望可以从更通用的注释处理框架中访问带注释的方法的主体。

java methods annotation-processing

5
推荐指数
0
解决办法
1014
查看次数

Java注释处理器 - 带注释的Kotlin类单元测试

我有一个注释处理器,我想为Kotlin工作,但是我在单元测试方面遇到了麻烦.如果有人能给我一些建议,我真的很感激.

我目前的单元测试实现使用了Google的编译测试库.我创建输入和输出类并将它们存储在资源目录中.然后在单元测试期间,编译测试库编译输入java类,执行注释处理器,然后将生成的类与资源目录中的预期输出类进行比较.

以下是我所指的示例(来自我的项目): 单元测试类 资源(输入和预期输出类

这对我目前所有基于java的单元测试都很有用.但是,当我尝试使用Kotlin类编写一些测试时,我的测试无法加载该类.

我相信这是因为编译测试库首先是Java特定的库(我没有在他们的项目中看到Kotlin的任何提及)

目前我收到以下问题:

java.lang.IllegalArgumentException: Compilation unit is not of SOURCE kind: "/C:/dev/gsonpath/gsonpath-compiler/build/resources/test/adapter/auto/field_types/primitives/valid/TestValidPrimitives.kt"

at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:137)
at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:107)
at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:64)
at com.google.testing.compile.Compilation.compile(Compilation.java:69)
at com.google.testing.compile.JavaSourcesSubject$CompilationClause.compilesWithoutError(JavaSourcesSubject.java:281)
Run Code Online (Sandbox Code Playgroud)

问题很明显,正在使用不正确的编译器.当我的文件扩展名不是'.java'时,抛出异常本身.如果我尝试使用'.java'文件扩展名加载Kotlin类,则它不起作用,因为它不是正确的Java语法.

有没有人遇到过这个问题并解决了它?我已经看过其他一些注释处理器(例如DBFlow),并且他们没有以这种方式编写单元测试.

由于Kotlin最近刚刚涉足注释处理,或许我是第一个遇到这个问题的人?

java junit unit-testing annotation-processing kotlin

5
推荐指数
1
解决办法
634
查看次数

Android Studio 2.4 + Lombok annotationProcessor配置混乱

我在一些项目上使用lombok,现在使用新的Android Studio 2.4 Update(预览版)我得到了这个奇怪的错误:

出了什么问题:任务'执行失败':core:javaPreCompileRelease'.必须立即显式声明注释处理器.发现以下对编译类路径的依赖包含注释处理器.请将它们添加到annotationProcessor配置中. - lombok-1.16.16.jar或者,设置android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true以继续之前的行为.请注意,此选项已弃用,将来会被删除.有关 详细信息,请参阅 https://developer.android.com/r/tools/annotation-processor-error-message.html.

我已经尝试过:

annotationProcessor"org.projectlombok:lombok:1.16.16"

但没有效果.

我还测试过:

android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true

但也没有效果.

还检查了支持页面以获取更多信息,但没有运气,你们中的任何人可能吗? https://developer.android.com/studio/preview/features/index.html?utm_source=android-studio#annotationProcessor_config

android annotation-processing lombok android-studio android-studio-2.4

5
推荐指数
1
解决办法
3405
查看次数

试图在AOSP中运行ButterKnife,返回NullPointerException

尝试使用butterknife 8.4.0测试应用程序和一些示例文本,我不断得到一个NullPointerException实际代码本身很好,但我相信Android.mk可能是问题.所以这是makefile的部分问题:

LOCAL_STATIC_JAVA_LIBRARIES := \
 dialer-butterknife-target \
 dialer-butterknife-compiler-target \
 dialer-butterknife-annotations-target \ 

PROCESSOR_LIBRARIES_TARGET := \
 dialer-auto-value \
 dialer-butterknife \
 dialer-butterknife-compiler \
 dialer-butterknife-annotations \ 

PROCESSOR_JARS := $(call java-lib-deps, $(PROCESSOR_LIBRARIES_TARGET))
# Necessary for annotation processors to work correctly.
LOCAL_ADDITIONAL_DEPENDENCIES += $(PROCESSOR_JARS)

LOCAL_JACK_FLAGS += --processorpath $(call normalize-path-   list,$(PROCESSOR_JARS))
LOCAL_JAVACFLAGS += -processorpath $(call normalize-path-list,$(PROCESSOR_JARS))


LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
dialer-butterknife:../../../prebuilts/tools/common/m2/repository/com/jakewharton/butterknife/8.4.0/butterknife-8.4.0.aar \
dialer-butterknife-compiler:../../../prebuilts/tools/common/m2/repository/com/jakewharton/butterknife-compiler/8.4.0/butterknife-compiler-8.4.0$(COMMON_JAVA_PACKAGE_SUFFIX) \
dialer-butterknife-annotations:../../../prebuilts/tools/common/m2/repository/com/jakewharton/butterknife-annotations/8.4.0/butterknife-annotations-8.4.0$(COMMON_JAVA_PACKAGE_SUFFIX) \ 

include $(CLEAR_VARS)

LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE := dialer-butterknife-target
LOCAL_SDK_VERSION := current
LOCAL_SRC_FILES := ../../../prebuilts/tools/common/m2/repository/com/jakewharton/butterknife/8.4.0/butterknife-8.4.0.aar
LOCAL_UNINSTALLABLE_MODULE := true

include …
Run Code Online (Sandbox Code Playgroud)

android annotation-processing android-source android.mk butterknife

5
推荐指数
0
解决办法
129
查看次数