annotationProcessors:
要运行的注释处理器的名称.仅适用于JDK 1.6+如果未设置,则应用默认注释处理器发现过程.
这里的默认注释处理器发现过程是什么?有没有其他方法来设置注释处理器而不是此配置标签?
我发现注释处理工具入门(apt)文档提到了一个默认的发现过程,但它适用于工厂类而不是处理器,不幸的是它使用了JDK中的tools.jar和com.sun包.这是默认的注释处理器发现过程吗?
java maven-2 annotations annotation-processing maven-compiler-plugin
在我的app模块的build.gradle中,我添加了
dependencies {
kapt('com.android.databinding:compiler:3.1.2')
...
}
Run Code Online (Sandbox Code Playgroud)
但我仍然收到编译器警告
app: 'annotationProcessor' dependencies won't be recognized as kapt annotation processors. Please change the configuration name to 'kapt' for these artifacts: 'com.android.databinding:compiler:3.1.2'.
Run Code Online (Sandbox Code Playgroud)
一切正常,我只是讨厌挂着警告.
任何帮助深表感谢!
我想在运行时访问声明字段的泛型类型.我之前的印象是,由于Java类型的擦除,这是不可能的.但是,情况并非如此,因为一些众所周知的框架在运行时通过反射来利用泛型类型.
例如,Guice将根据您提供的泛型类型实现Provider:
public class Injectable{
@Inject
private Provider<SomeType> someTypeProvider;
}
Run Code Online (Sandbox Code Playgroud)
如何通过反射API访问字段的"SomeType"泛型属性或任何此类类型/方法/等?
此外,了解如何通过Java 6 Annotation Processor API访问这些泛型类型属性也很有帮助.
谢谢.
编辑:
谢谢大家的指示.我找到了一种方法,使用haylem的链接,特别是Prenkov的文章Java Reflection:Generics.
这是我正在寻找的答案:
/**
* @author John Ericksen
*/
public class TypeReflectionExample {
public class SomeType{}
public class Injectable{
@Inject private Provider<SomeType> someTypeProvider;
}
public static void main(String[] args){
try {
Field providerField = Injectable.class.getDeclaredField("someTypeProvider");
Type genericFieldType = providerField.getGenericType();
if(genericFieldType instanceof ParameterizedType){
ParameterizedType aType = (ParameterizedType) genericFieldType;
Type[] fieldArgTypes = aType.getActualTypeArguments();
for(Type fieldArgType : fieldArgTypes){
Class fieldArgClass = (Class) fieldArgType; …Run Code Online (Sandbox Code Playgroud) 我正在使用JDK 6的Annotation Processing API开发一个小代码生成器,并试图获得类中字段的实际泛型类型.为了更清楚,让我们说我有这样一个类:
@MyAnnotation
public class User {
private String id;
private String username;
private String password;
private Set<Role> roles = new HashSet<Role>();
private UserProfile profile;
}
Run Code Online (Sandbox Code Playgroud)
这是我的注释处理器类:
@SupportedAnnotationTypes({ "xxx.MyAnnotation" })
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class MongoDocumentAnnotationProcessor extends AbstractProcessor {
private Types typeUtils = null;
private Elements elementUtils = null;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
typeUtils = processingEnv.getTypeUtils();
elementUtils = processingEnv.getElementUtils();
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
debug("Running " + getClass().getSimpleName());
if (roundEnv.processingOver() …Run Code Online (Sandbox Code Playgroud) 我有两个类的方法,我想将两个类的方法组合到一个类.
@Service("ITestService")
public interface ITest1
{
@Export
void method1();
}
@Service("ITestService")
public interface ITest2
{
@Export
void method2();
}
Run Code Online (Sandbox Code Playgroud)
结果应该是:
public interface ITestService extends Remote
{
void method1();
void method2();
}
Run Code Online (Sandbox Code Playgroud)
我的AnnotationProcessor的第一次运行生成正确的输出(因为RoundEnvironment包含两个类).
但是如果我编辑其中一个类(例如添加一个新方法),RoundEnviroment只包含已编辑的类,因此结果如下(向接口ITest1添加newMethod())
public interface ITestService extends Remote
{
void method1();
void newMethod();
}
Run Code Online (Sandbox Code Playgroud)
现在缺少method2.我不知道如何解决我的问题.有没有办法(Enviroment),访问项目中的所有类?或者还有另一种解决方法吗?
生成类的代码很长,所以这里简要介绍我如何生成类.我遍历Elements env.getElementsAnnotatedWith(Service.class)并提取方法并将它们写入新文件:
FileObject file = null;
file = filer.createSourceFile("com/test/" + serviceName);
file.openWriter().append(serviceContent).close();
Run Code Online (Sandbox Code Playgroud) 在java.lang.reflect,人们会这样做:
Field someField = ...;
Class<?> fieldType = someField.getType();
Run Code Online (Sandbox Code Playgroud)
但是,我该怎么做用javax.lang.model的VariableElement(这可能会或可能不会代表一个字段)?相应的返回值将是(我猜)TypeElement.
VariableElement someField = ...;
TypeElement fieldType = someField.???;
Run Code Online (Sandbox Code Playgroud)
那么,在javax.lang.model,如何获得TypeElement字段的类型(或),由VariableElement?表示?
顺便说一下,没有一个适合javax.lang.model的Stackoverflow标签;)
我有一个Gradle构建脚本,它使用注释处理器(Android Annotations)来生成代码.建筑物很好,直到我添加了一个新的Pro Flavor.我可以构建Free味道,但是当我构建Pro flavor时,注释处理器不会运行.这会导致代码丢失并且构建失败.
这是我的脚本:
buildscript {
repositories {
maven { url 'http://repo1.maven.org/maven2' }
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
}
ext.androidAnnotationsVersion = '3.0-SNAPSHOT';
configurations {
apt
}
dependencies {
compile files('libs/android-support-v13.jar')
compile fileTree(dir: 'libs', include: '*.jar')
apt "org.androidannotations:androidannotations:${androidAnnotationsVersion}"
compile "org.androidannotations:androidannotations-api:${androidAnnotationsVersion}"
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 7
targetSdkVersion 17
versionCode 29
versionName "2.0.3"
packageName "com.MyCompany.MyApp"
}
productFlavors {
free …Run Code Online (Sandbox Code Playgroud) android gradle annotation-processing android-annotations android-studio
我正在使用Java注释处理器.我的注释@foo用于标记可在运行时读取到文件或文件的字段变量.但是,我想检查变量类型是否Serializable在编译期间实现,因此如果该字段不可序列化,我可以在编译时给出警告/错误.
(我不需要实际检查对象是否可序列化,如果它实现了Serializable我信任它的接口).
我已经想出了如何做其他的东西,但我无法弄清楚如何检查该元素是否实现Serializable.我可以使用这个TypeElement#getInterfaces方法,但我无法弄清楚如何检查是否有任何TypeMirror返回的方法Serializable.
此外,如果有人碰巧知道任何好的java.lang.model或Java Annotations教程,那也会有所帮助.
编辑:我试过这个......
isSerializable = false
for(TypeMirror tm : processingEnv.getTypeUtils().directSupertypes(em.asType()))
{
if(isSerializable = "java.io.Serializable".equals(tm.toString()))
{
break;
}
}
Run Code Online (Sandbox Code Playgroud)
它适用于直接实现的String和Character,Serializable但是对于从Number超类继承Serializable的Integer,它不起作用.
我正在为Android构建一个Annotation Processor(为了将来的解释,让我们称之为TestProcessor).
计划是让处理器以两种模式运行:
Mode 1:生成代码 A
Mode 2:生成代码A和B
Mode 2 只有在处理器生成代码的环境中存在附加(可选)包时才应选择.
如果可选包存在,有没有办法找到注释处理器的process方法?
编辑1:
关于"(可选)包"的小澄清.通过附加包我的意思是一个java包,它可能但不一定存在于项目中(即使用处理器).可选包可以例如表示外部库的内容.外部库可以但不必包含在项目中.
我举一个小例子:
Sample.Sample正在使用我的TestProcessor.Square's Picasso以外部库为例SampleHAS Square's Picasso作为其依赖项之一,则TestProcessor运行Mode 2并生成代码A和B.换句话说:如果您可以使用com.square.picasso(in Sample)中的类而没有任何问题,那么处理器应该运行Mode 2.Square's Picasso在Sample's相关性,TestProcessor工作中Mode 1,并生成唯一的代码A.编辑2:
我想到了这个问题的两个解决方法:
processor Modes(例如: …我已经读过,自版本6.9以来,Netbeans包含注释处理支持,例如,需要一个功能来生成JPA 2.0实体的元模型.
但是,我找不到任何能够准确显示如何操作的示例或文档.你们有没有成功的人?
java ×8
android ×3
annotations ×3
generics ×2
reflection ×2
criteria-api ×1
gradle ×1
guice ×1
jpa-2.0 ×1
kapt ×1
kotlin ×1
maven-2 ×1
mirror ×1
netbeans ×1
type-erasure ×1
types ×1