gpt4 book ai didi

java - 如何使用后面的代码创建自定义注释

转载 作者:IT老高 更新时间:2023-10-28 20:51:54 25 4
gpt4 key购买 nike

我想创建自己的自定义注释。我的框架是独立的 Java 应用程序。当有人注释他的 pojo 类时,后面的“隐藏”代码将触发方法。

例如,今天在 Java EE 中,我们有 @MessageDriven 注释。当您使用 @MessageDriven 注释您的类并另外实现 MessageListener 接口(interface)时,会有一个后面的代码将触发 onMessage(Message msg)。当消息从队列/主题到达时。

如何创建可以添加到 pojo 并实现 MyCustomMessageListener 的注释 (@MyMessageDriven)。

我想要的结果是触发“隐藏”代码(我的),这将触发已实现接口(interface)的方法(与我在下面编写的示例完全一样)。

最佳答案

我推荐阅读 this blog entry (snapshot on archive.org)直到作者记得他可以访问 Spring 的组件扫描功能。

最初的问题是扫描类路径以查找具有自定义注释的类。完成此操作后,您将在独立应用程序中拥有使用 object.getClass().getAnnotations() 的对象。 ,然后您可以将需要添加的监听器或自定义行为注入(inject)到包含自定义注释的对象中。

假设您有以下自定义注释:

@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyMessageDriven {}

你在你的应用程序中使用它的一些类:

@MyMessageDriven
public class MyObject {}

现在,在你的应用程序的适当位置,你应该有一个方法来给出所有携带 MyMessageDriven 的类:

Set<Class<?>> findAllMessageDrivenClasses() {
final StopWatch sw = new StopWatch();
sw.start();
final Reflections reflections = new Reflections("org.projectx", new TypeAnnotationsScanner());
Set<Class<?>> allMessageDrivens = reflections.getTypesAnnotatedWith(MyMessageDriven.class); // NOTE HERE
sw.stop();
return allMessageDrivens;
}

有了这个,我假设您的应用程序中存在这样一个点:(1) 您可以访问应用程序中的对象,或者 (2) 应用程序中的所有对象都存在访问者或迭代器模式。因此,在某些时候,我假设我们将所有目标对象作为 objects:

Set<Class<?>> msgDrivenClasses = findAllMessageDrivenClasses();
for (Object o : objects) {
if (msgDrivenClasses.contains(o.getClass()) {
invokeTheMessageListener(o);
}
}

另一方面,当找到具有 MyMessageDriven 的对象时,应该有一些 MyMessageListener 实现可用:

void invokeTheMessageListener(Object o) {
theMessageListener.onMessage(o);
}

此答案是根据博客条目量身定制的,因此请参阅博客以了解库的配置。最后但并非最不重要的一点是,这是该问题的示例代码,可以将其重构为更兼容模式和更优雅的风格。

更新:目标对象需要知道自己的监听器。所以,我建议采用以下方法。让我们有一个接口(interface)MyMessageListenerAware:

interface MyMessageListenerAware {
MyMessageListener getMyMessageListener();
}

// and this is the original MyMessageListener
interface MyMessageListener {
void onMessage(Object o);
}

现在,目标对象应该实现上述接口(interface):

class MySampleObject implements MyMessageListenerAware {

public MyMesssageListener getMyMessageLisener() {
return mySampleObjectImplementationOfMyMessageListener;
}

}

有了这个,方法 invokeTheMessageListener 变成:

void invokeMessageListener(Object o) {
if (o instance MyMessageListenerAware) {
MyMessageListener l = ((MyMessageListenerAware) o).getMyMessageListener();
l.onMessage(o);
}
}

虽然,我强烈推荐阅读 VisitorStrategy图案。在我看来,您的目标是需要某些对象对应用程序中的公共(public)对象/事件使用react/行动/处理,但每个都有自己的解释/算法/实现。

关于java - 如何使用后面的代码创建自定义注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10205261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com