当前位置: 首页 > 面试题库 >

如何使用背后的代码创建自定义注释

柳坚白
2023-03-14
问题内容

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

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

如何创建批注(@MyMessageDriven),可以将其添加到pojo并实现MyCustomMessageListener

我希望得到的结果是(我的)“隐藏”代码的触发器,该触发器将触发已实现接口的方法(恰好与下面的示例i Wrote一起使用)。


问题答案:

我建议阅读此博客条目(archive.org上的快照),直到作者记得他可以使用Spring的组件扫描功能为止。

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

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

@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);
  }
}

另一方面,MyMessageListenerMyMessageDriven找到具有的对象时,应该可以使用一些实现:

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

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

更新 :有一个要求, 目标
对象应了解其自己的侦听器。因此,我建议采用以下方法。让我们有一个接口MyMessageListenerAware

interface MyMessageListenerAware {
  MyMessageListener getMyMessageListener();
}

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

现在,目标对象应实现上述接口:

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);
  }
}

虽然
,但我强烈建议阅读有关访问者或策略模式的信息。在我看来,您想要做的事情似乎是您需要某些对象对应用程序中的常见对象/事件做出反应/动作/过程,但
每个 对象 都有 自己的解释/算法/实现。



 类似资料:
  • 我想创建自己的自定义注释。我的框架是独立的java应用程序。当有人注释他的pojo类时,隐藏的代码将触发方法。 例如,今天在JavaEE中,我们有注释。当您使用注释您的类并另外实现MessageListener Interface时,有一个后面的代码将触发。当消息从队列/主题到达时。 如何创建可以添加到pojo并实现MyCustomMessageListener的注释()。 我想要的结果是触发(我

  • 问题内容: 注释如何与Java一起使用?以及如何创建这样的自定义注释: 基本上,我需要保留的POJO在持久化时像这样进行序列化: 这样,实际的生成/持久对象是这样的: 任何想法如何实现这一点? 问题答案: 如果创建自定义注释,则必须使用此处的 API 示例进行处理。您可以参考如何声明注释。 这是Java中的示例注释声明的样子。 并被称为。 表示您想在运行时保留注释,并且可以在运行时访问它。 表示您

  • 我想用java为创建自定义注释。我想用这个注释比较两个字符串值,比较后会返回一个

  • 我在代码中使用Lombok自动生成getter和setter代码。我想添加其他个人注释并使用它。 例如,我想添加一个方法来验证列表中是否存在一个键: 创建注释后,我将执行以下操作:

  • 我试图使用OpenNLPJavaAPI从文档中提取名称、技能等实体。但它没有提取正确的名称。我使用opennlp源锻造链接上可用的模型 下面是一段java代码- 我想做的是: 我正在使用ApacheTika将PDF文档转换为纯文本文档 但它正在提取姓名和其他单词。它不是提取专有名称。如何创建自定义模型,从文档中提取游泳、编程等技能? 给我一些想法! 任何帮助都将不胜感激!?

  • 问题内容: 我正在http://www.cafeaulait.org/javafaq.html上阅读#6.10项,然后我开始怀疑大型企业如何创建自己的JVM实现。一个人会尝试(或可行)实验性的东西吗? 问题答案: 从技术上讲,创建该新JVM所需的所有信息都是该语言和目标平台的公共规范。即使字节码解释在很大程度上相同,JVM还是需要根据其是要在台式机还是手机上运行而有所不同。 一些开始寻找信息的地方