当前位置: 首页 > 知识库问答 >
问题:

如何使用代码隐藏创建自定义注释

杜禄
2023-03-14

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

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

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

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

共有2个答案

子车凌龙
2023-03-14

创建如下注释:

 public @interface MyMessageDriven{
 }

您有一个可以应用注释的界面,如下所示:

public interface MyMessagListener {

    public void message();
}



@MyMessageDriven  
public class MyMessage implements MyMessagListener  {
   public void message(){
     System.out.println(" I am executed")
   }
} 

使用类加载器加载上述类,并使用反射检查注释是否是预演的。

如果存在,请使用加载的实例来执行它。

  Object obj = ClassLoader.getSystemClassLoader().loadClass("MyMessage").newInstance();
  MyMessagListener mml =  (MyMessagListener) obj;
  mml.message();

监听器实现可以放在MyMessage类或实现MessageListener的其他类中。

在这种情况下,需要为消息()提供它要做的事情的实现。

但是应该加载这个类,这里更重要的是如何加载MyMessage类。

这是基于MyMessage类中存在的元数据。类似地,在实时场景中也是如此。

注释是类的元数据,表示根据提供的数据,做某事。如果MyMessage类中没有此元数据,则无需执行消息()方法。

希望这对你有帮助。

伯晨
2023-03-14

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

最初的问题是扫描类路径以查找具有自定义注释的类。完成此操作后,您就可以在独立应用程序中使用对象了。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)应用程序中的所有对象上都有一个访问者或迭代器模式。因此,在某种程度上,我假设我们所有的目标对象都是对象:

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

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

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

}

有了这个,方法调用TheMessageListener变得像:

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

尽管如此,我强烈建议阅读关于访问者或策略模式的内容。在我看来,您的目标似乎是需要某些对象对应用程序中的常见对象/事件作出反应/采取行动/处理,但每个对象都有自己的解释/算法/实现。

 类似资料:
  • 问题内容: 我想创建自己的自定义注释。我的框架是独立Java应用程序。当有人注释他的pojo类时,后面的“隐藏”代码将触发方法。 例如,今天在Java EE中,我们具有注释。并且,当您使用注释类并另外实现MessageListener接口时,将触发一个背后的代码。当消息从队列/主题到达时。 如何创建批注(),可以将其添加到pojo并实现。 我希望得到的结果是(我的)“隐藏”代码的触发器,该触发器将

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

  • 我有一个代码与许多评论,我如何可以隐藏这些,但没有删除,我需要他们之后。

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

  • 我试图用web表单做一个web调查应用程序。问题是我在调查创建部分有麻烦。

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