我正在使用 java 6 注释处理 api。我遵循以下优秀教程来创建在构建时显示消息的注释处理器:
http://kerebus.com/2011/02/using-java-6-processors-in-eclipse/
然而,就我而言,我有一个简单的类:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.METHOD)
public @interface Criteria {
String id();
double width();
double height();
}
正如您所看到的,上述注释可在运行时使用元注释“Retention”提供给 JVM。我在另一个类的源代码中使用这个“Criteria”注释来注释方法,如下所示:
@Criteria(id = "fooBar",
width = 22,
height = 10
)
public void fooStream() {
System.out.println("foo stream method");
}
在运行时,我想在另一个类中包含“fooStream”方法,仅当传入的变量与@Criteria注释中的元素值(即“宽度”和“高度”)匹配时。我的问题是,如何采用方法“fooStream”并在运行时将其注入到另一个类中?这可能吗?我不是在寻找任何代码示例,只是寻找上述两个问题的答案。此外,在顶部的链接中,有一个使用“JavaFileObject”和“Writer”实例生成代码的示例,其中生成的代码作为字符串传递。
我不相信 Java 支持运行时类型突变,这意味着要修改给定类的成员,您必须返回到编译时预处理器或字节码修改方案。
如果我理解这个问题背后的“为什么”,我就能为你指明更好的方向,但与此同时,动态代理类可能会带你去你想去的地方(Java世界文章).
从文档中:
动态代理类是这样的类
实现接口列表
在运行时指定,以便
通过其中之一进行方法调用
类实例上的接口
将被编码并发送到
穿过制服的另一个物体
界面。因此,动态代理类
可用于创建类型安全的
接口列表的代理对象
无需预先生成
代理类,例如
编译时工具。方法调用
在动态代理的实例上
类被分派到一个
实例调用中的方法
处理程序,并且它们用一个编码
java.lang.reflect.Method 对象
识别方法
调用和一个 Object 类型的数组
包含参数。
这里有一个体面的tutorial关于使用 Spring 根据自定义注释注入动态代理。我认为这可能最接近您所追求的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)