【问题标题】:How to understand annotation in java And How to implement my annotation in java?如何理解 java 中的注解以及如何在 java 中实现我的注解?
【发布时间】:2016-12-05 10:16:04
【问题描述】:

我所知道的是:

  • 在 java 5 中添加了注解
  • 注解可以在方法、类和属性中使用
  • 注释可以在 RUNTIME、CLASS、SOURCE 中工作(我不知道如何使用 CLASS 和 SOURCE 以及它们的功能)
  • 在 java 程序运行时,可以实现保留为 RUNTIME 的注解。

并且我想实现一个注释以具有以下功能:

  • 确保只允许类创建实例
  • 确保只允许方法访问类中的方法
  • 在 c++ 中就像朋友一样
  • 它与public和private相同,但更动态,如

    @MyAnnotation(allowMethods={xxx.doSomething})
    公共无效 getValue(){}

    getValues 方法只能在实例 self 和 xxx.doSomething() 方法中访问

接下来我应该做什么和学习?

我在哪里可以了解这些?

【问题讨论】:

  • 我不完全理解您要实现的两个功能,但听起来很像可以使用访问修饰符来完成(private vs public)。
  • @Thilo 如果我正确理解了 OP,这听起来与访问修饰符相反。 “确保方法只被允许访问类中的方法”听起来像只允许该方法调用同一个类的方法(==没有“外部类”依赖项)......可能是这样吗?如果我理解有误,请指正。
  • @Fildor 我有更新问题描述,你能看懂吗?如果没有,请@我

标签: java annotations


【解决方案1】:

我想你可能会误解那里的一些东西。注释是描述性元素,而不是程序的一部分。您可以编写任意数量的注释,使用您的代码的人仍然可以忽略它们。

也就是说,可以在编译或运行时实际实现一个强制执行策略的注释(就像你的那样),但你需要一个外部机制来帮助你。我能想到3个:

  1. Annotation processing 允许您与编译器交互并通过生成代码或忽略编译器错误来处理注释。不幸的是,我认为它不适用于您的情况,因为您想保护带注释的类型不被实例化,这意味着调用站点实际上没有注释。注释处理只允许您访问具有注释的实际代码片段,而不是引用它们的代码片段。
  2. AspectJ 允许您基于静态切入点编写策略执行方面并省略编译器错误。这里的问题是静态切入点的语义非常有限,因此虽然您可以完全禁止类的实例化,或者禁止某些包的实例化,但您不能将类实例化限制为 1。
  3. 第三种方法,也可能是唯一合理的方法是使用 Spring 或 Guice 之类的容器并将类配置为单例。只要您只从容器中检索您的类,它就永远不会创建第二个实例。

最后:如果你想限制你的类的实例化数量,你总是可以使用经典的Singleton pattern approach

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 2019-10-26
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2014-07-21
    相关资源
    最近更新 更多