- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有plenty of features已在 Jeta
上提供,但是如果缺少某些东西怎么办。我可以创建自己的注释并为它们生成元代码吗?
需要一个分步教程如何创建自定义 Jeta
处理器。
最佳答案
如何创建自定义处理器,分步教程
第一步:Hello, World
项目
对于本教程,让我们创建一个简单的 Gradle
一个模块的项目app
并且只有一个类SayHelloApp
.这个类写Hello, World!
到标准输出。
对于我们要创建的插图Hello
设置 Hello, Jeta!
的注释字符串到带注释的字段。
第二步:common
模块
首先,我们需要一个可以在 app
中访问的模块。和 apt
(将很快创建)模块。在 common
模块我们需要两个类 - Hello
注释和 HelloMetacode
界面:
第三步:apt
模块apt
- 是一个模块,我们将在其中创建代码生成类所需的所有内容。对于本教程,我们需要一个处理器来处理我们的 Hello
注解。
注意这个模块依赖于common
模块所以我们使用 Hello
注解作为 super 构造函数的参数。通过这样做,我们对 Jeta
说我们需要用给定类型注释的所有元素。该模块还依赖于 jeta-apt
为了访问 Jeta
类。
第 4 步:处理器
已创建 SayHelloProcessor
现在什么都不做。让我们在其中添加一些逻辑。这里的想法是生成设置 Hello, Jeta
的 java 代码。使用 Hello
注释的字段的字符串.
请注意 Jeta
使用 JavaPoet
创建java源代码。 Square
的框架真的很棒.请在 GitHub 上查看.
首先,我们需要我们的 metacode实现 HelloMetacode
.为此,我们将向 builder
添加 super 接口(interface)。 :
MetacodeContext context = roundContext.metacodeContext();
ClassName masterClassName = ClassName.get(context.masterElement());
builder.addSuperinterface(ParameterizedTypeName.get(
ClassName.get(HelloMetacode.class), masterClassName));
HelloMetacode
通过创建
void setHello(M master)
方法:
MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("setHello")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(void.class)
.addParameter(masterClassName, "master");
Hello
注释的每个元素的语句, 那
Jeta
传入
process
方法通过
roundContext
范围:
for (Element element : roundContext.elements()) {
String fieldName = element.getSimpleName().toString();
methodBuilder.addStatement("master.$L = \"Hello, Jeta\"", fieldName);
}
SayHelloProcessor
list :
package org.brooth.jeta.samples.apt;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeSpec;
import org.brooth.jeta.apt.MetacodeContext;
import org.brooth.jeta.apt.RoundContext;
import org.brooth.jeta.apt.processors.AbstractProcessor;
import javax.lang.model.element.Element;
import javax.lang.model.element.Modifier;
public class SayHelloProcessor extends AbstractProcessor {
public SayHelloProcessor() {
super(Hello.class);
}
@Override
public boolean process(TypeSpec.Builder builder, RoundContext roundContext) {
MetacodeContext context = roundContext.metacodeContext();
ClassName masterClassName = ClassName.get(context.masterElement());
builder.addSuperinterface(ParameterizedTypeName.get(
ClassName.get(HelloMetacode.class), masterClassName));
MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("setHello")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(void.class)
.addParameter(masterClassName, "master");
for (Element element : roundContext.elements()) {
String fieldName = element.getSimpleName().toString();
methodBuilder.addStatement("master.$L = \"Hello, Jeta\"", fieldName);
}
builder.addMethod(methodBuilder.build());
return false;
}
}
jeta.properties
用于配置
Jeta
的文件.您可以找到有关此文件的更多详细信息
on this page .该文件应位于根包中。对于我们的教程,它的内容是:
metasitory.package=org.brooth.jeta.samples
processors.add=org.brooth.jeta.samples.apt.SayHelloProcessor
SayHelloApp
.而不是初始化
text
我们将输入的字段
Hello
注释:
public class SayHelloApp {
@Hello
String text;
}
build.gradle
:
group 'org.brooth.jeta-samples'
version '1.0'
buildscript {
repositories {
maven {
url 'https://plugins.gradle.org/m2/'
}
}
dependencies {
classpath 'net.ltgt.gradle:gradle-apt-plugin:0.5'
}
}
apply plugin: 'net.ltgt.apt'
apply plugin: 'java'
sourceCompatibility = 1.7
repositories {
mavenCentral()
jcenter()
}
compileJava {
options.sourcepath = files('src/main/java')
}
dependencies {
apt project(':apt')
compile project(':common')
compile 'org.brooth.jeta:jeta:+'
}
./gradlew assemble
SayHelloApp_Metacode
app/build
下的文件目录:
HelloMetacode
创建一个在
app
模块:
package org.brooth.jeta.samples;
import org.brooth.jeta.MasterController;
import org.brooth.jeta.metasitory.Metasitory;
public class SayHelloController<M> extends MasterController<M, HelloMetacode<M>> {
public SayHelloController(Metasitory metasitory, M master) {
super(metasitory, master, Hello.class, false);
}
public void setHello() {
for (HelloMetacode<M> metacode : metacodes)
metacode.setHello(master);
}
}
MetaHelper
是一个简单的静态助手类。如果您对静态助手不满意,则不应在项目中使用它。您可以在
this page 上阅读有关该类(class)的更多详细信息.
MetaHelper
在
app
模块:
package org.brooth.jeta.samples;
import org.brooth.jeta.metasitory.MapMetasitory;
import org.brooth.jeta.metasitory.Metasitory;
public class MetaHelper {
private static MetaHelper instance;
private final Metasitory metasitory;
public static MetaHelper getInstance() {
if (instance == null)
instance = new MetaHelper("org.brooth.jeta.samples");
return instance;
}
private MetaHelper(String metaPackage) {
metasitory = new MapMetasitory(metaPackage);
}
public static void setHello(Object master) {
new SayHelloController<>(getInstance().metasitory, master).setHello();
}
}
MapMetasitory
我们指定为
"org.brooth.jeta.samples"
的相同包 (
metasitory.package
)在
jeta.properties
.
MetaHelper
的方法。这是
SayHelloApp
的完整列表:
package org.brooth.jeta.samples;
public class SayHelloApp {
@Hello
String text;
public SayHelloApp() {
MetaHelper.setHello(this);
}
public void sayHello() {
System.out.print(text);
}
public static void main(String[] args) {
new SayHelloApp().sayHello();
}
}
SayHelloApp
.在控制台中,我们应该看到:
Hello, Jeta
关于java - Jeta:如何创建自定义注释处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37210107/
有plenty of features已在 Jeta 上提供,但是如果缺少某些东西怎么办。我可以创建自己的注释并为它们生成元代码吗? 需要一个分步教程如何创建自定义 Jeta处理器。 最佳答案 如何创
我是一名优秀的程序员,十分优秀!