我试图用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) 我想要一个像这样的字符串:
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
我在使用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
我正在使用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项目中.怎么避免这个?
如何在不使用javac编译源代码的情况下运行注释处理器(Java 8不能使用Apt)?
是否有任何javac参数只能运行注释处理而不编译所有文件?
我想通过javac做什么:
只需找到带注释的元素并使用-processor标志使用定义的注释处理器处理它们
千万不能编译没有任何注解的源
因为我想在Java 8上执行此操作,所以无法使用Apt执行此任务?或许它是?
我想用Dagger在IntelliJ但不能用。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) 在我的帮助下,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()方法trees中com.sun.source.util.Treesset 的实例在哪里:trees = Trees.instance(processingEnv);
但是这些类带有警告:这不是任何受支持的API的一部分。如果编写依赖于此的代码,则后果自负。该代码及其内部接口如有更改或删除,恕不另行通知。
我希望可以从更通用的注释处理框架中访问带注释的方法的主体。
我有一个注释处理器库,我想为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最近刚刚涉足注释处理,或许我是第一个遇到这个问题的人?
我在一些项目上使用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
尝试使用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
java ×7
android ×3
gradle ×2
javac ×2
android.mk ×1
annotations ×1
butterknife ×1
dagger ×1
eclipse ×1
java-8 ×1
junit ×1
kotlin ×1
lombok ×1
m2e ×1
maven ×1
methods ×1
unit-testing ×1