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

在Java中创建带注释的对象时收到通知

湛联
2023-03-14

我有一个自定义Java注释:@DynamicField

public class RESTEndpointInvoker {
  @DynamicField(key="httpTimeout")
  private long httpTimeout = 8000L;

  public void setHttpTimeout(long t){
    this.httpTimeout = t;
}

当有人更改文件或数据库中与带注释字段对应的值时,调用具有该属性的所有实例的setter以反映新值。因此,我需要跟踪所有使用注释的实例,在地图或其他东西中,以便在外部发生更改时更新它们:

Map<Key,List<Instance>>

注意:我打算使用某种形式的WeakHashMap()来避免保留对过时实例的引用。

理想情况下,我希望在创建实例时收到通知。

我可以扫描类路径中的类类型,然后在每个类中搜索带注释的字段(见下文),但我不确定如何跟踪活动实例。

  //get classes with annotation
  Reflections r = new Reflections("com.foo", new TypeAnnotationsScanner());
  Set<Class<?>> allAnnotated = r.getTypesAnnotatedWith(DynamicField.class);
  //identify fields
  for(Class<?> cls : allAnnotated){
    for(Field field : cls.getDeclaredFields()){
    Class type = field.getType();
    String name = field.getName();
    if(field.isAnnotationPresent(DynamicField.class)){
      ....
    }
  }
}

如果这些实例是SpringBean,我可以这样做,但我宁愿避免这种限制。


共有1个答案

巫马瀚漠
2023-03-14

创建此类对象时需要注意。有两种方法:AOP(或其他代码修改)和agentlib。

使用AspectJ(或其他一些AOP系统),您可以在构造这些类的所有对象时获得控制。为了知道要处理哪些构造函数,您需要在编写时扫描类路径以查找带有注释的类。

AspectJ的文档主要描述在编译时获取已知的东西,但我有理由相信您可以动态地锁定这些东西。如果没有,可以应用asm或其他codegen工具之一;参见示例http://zeroturnaround.com/rebellabs/how-to-make-java-more-dynamic-with-runtime-code-generation/在你的社区讨论一些事情。如果控制类装入器,则可以通过拦截类装入并注意注释中的类装入来避免扫描。

另一种选择是配置文件系统使用的;注册一个agentlib。这是相当侵入性的,不太可能是一个有吸引力的前景。

 类似资料:
  • java验证的传统方式是定义一个具有属性的类,并用一个或多个验证约束注释进行注释,例如或。 是否可以使用验证器约束注释直接验证对象,而无需指定类。例如:

  • 问题内容: 是否可以在运行时创建hibernate的Entity类(带有注释)?它应与也在运行时中添加的表相关。重要的是,该实体应该对Hibernate可见。一般情况下是否可能,请您给我有关该问题的任何建议吗?我了解,反射是关键字,但需要更多的单词。问候。 问题答案: 在这种情况下,您可能希望在运行时以编程方式创建Hibernate Session Factory,并传入创建的新映射,请访问htt

  • 我正在做一个问答游戏,它将从一个文本文件中阅读一些问题和它们各自的答案。这些问题首先被放入一个ArrayList,然后每个问题都要被转换成一个单独的问题对象。正是在程序的这一部分中,我接收到一个IndexOutOfBoundsException。 文本文件的格式如下: 问题 正确答案 错误答案1 错误答案2 错误答案3 (空行) 问题2 ... ... ... 文本文件在名为IO的类中使用Buff

  • 问题内容: 我正在观看 Burt Beckwith* 制作的精彩视频 * http://www.infoq.com/presentations/GORM- Performance 他说: “在传统的Hibernate中,您可以将该系列映射为Bag, 这只是一个常规集合,没有顺序或唯一性保证” 我如何映射该集合,而没有带注释的顺序或唯一性?谢谢。 问题答案: 如果使用a 作为引用类型,但未指定索引号

  • 问题内容: 是否存在列注释语法,该语法允许我直接在创建表语句(即,内联)中声明列的位置指定列注释?该11克规范没有提到任何东西,在另一页中提到的东西,但我无法得到它的工作。创建表后有一种指定注释的方法,但是我认为将注释与字段定义分开很烦人。我正在寻找这样的东西(不起作用): 问题答案: 恐怕“烦人”的语法是这样做的唯一方法。SQL Server,PostgreSQL和DB2使用相同的语法(尽管据我

  • 问题内容: 是否可以在运行时创建休眠的Entity类(带有注释)?它应该与也在运行时添加的表相关。重要的是,该实体应该对Hibernate可见。一般情况下是否可能,请您给我有关该问题的任何建议吗?我了解,反射是关键字,但需要更多的单词。问候。 问题答案: 在这种情况下,您可能希望在运行时以编程方式创建Hibernate Session Factory,传入您创建的新映射,并查看http://doc