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

从注释字段接收注释值

国景铄
2023-03-14

是否可能在已注释的字段内接收注释值?假设我有这个界面:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value();
}

我有这样的实施:

class SomeClass {
    @MyAnnotation("Annotation")
    private MyClass myClass;
}

我想了解的是:是否可以在MyClass中接收MyAnnoation的值?我想在MyClass类中实现一个方法,它将返回一个分配注释的值。所以,myClass.getAssignedAnNotationValue()将返回“Annoation”。如果不可能,请通知我。

共有2个答案

贺兴平
2023-03-14

没有直接的方法来实现你的要求。

解决方法:

限制:

  1. 这种解决方法不强制执行任何编译时检查,处理它完全是您的责任
  2. 只有当MyClass将成为spring bean时,这才有效
class MyClass {
    public String annotatedValue;
}

可以用以下方法编写Spring BeanPostProcessor。

public class SampleBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
        throws BeansException {

        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
        throws BeansException {

        Field[] fields = bean.getClass().getDeclaredFields();
        for (Field field : fields) {
            if (field instanceof MyClass && field.isAnnotationPresent(MyAnnotation.class)) {
                String value = field.getDeclaredAnnotation(MyAnnotation.class).value();
                ((MyClass) field).annotatedValue = value;
                return bean;
            }
        }
        return bean;
    }
}

应用程序启动期间,将为每个bean调用上述BeanPostProcessor。它将检查给定bean的所有字段,以查看字段的类型是否为MyClass。如果是,它将从注释中提取值,并在注释值字段中进行设置。

这种方法的问题是,您可以对任何类中的任何属性使用MyAnnotation。您不能强制注释仅在MyClass上使用。

唐涛
2023-03-14

可以知道注释字段内的注释值吗

这是不可能的。

你可能有两个不同的班

class SomeClass {
    @MyAnnotation("Annotation")
    private MyClass myClass;
    public SomeClass(MyClass myClass) {
        this.myClass=myClass;
    }
}

class SomeClassNo Annotation {
    private MyClass myClass;
    public SomeClassNo(MyClass myClass) {
        this.myClass=myClass;
    }
}

然后创建MyClass的实例

MyClass实例=新的MyClass();

然后2个类实例new XXMClass(实例)new XXMClassNo(实例)都引用了同一个实例。因此实例不知道引用字段是否注释。

唯一可能的情况是以某种方式将容器引用传递给MyClass。

 类似资料:
  • 我用lombook注释了实体类(https://projectlombok.org/features/all): 我有使用这个实体从数据库中给我数据的服务。最后我尝试从会员对象中获取一些数据 但我在成员对象中没有任何getter。当我写我有错误(IDEA建议我创建getter'getName()')。如何将lombook与jpa实体一起使用?如何访问用lombok注释(如@Getter或@Sett

  • 问题内容: 什么时候在方法开始时使用块注释,什么时候使用Javadoc风格的注释? 在Java样式指南的“注释”部分中,我发现了这一点: Java程序可以有两种注释:实现注释和文档注释。实现注释是在C ++中发现的,由,和// 分隔。文档注释(称为“文档注释”)仅适用于Java,并以分隔。可以使用javadoc工具将Doc注释提取到HTML文件中。 实现注释用于注释掉代码或有关特定实现的注释。Do

  • 和和注释之间有什么区别? 我们应该在什么时候使用它们每一个?

  • 注释 良好的注释使代码更具有可读性和可维护性,尤其是多人协作的项目,不要让团队其他成员来猜测一段 代码的意图。 注释风格应当相对简洁,做如下规范: 区块注释放在单独一行。 保持注释内代码的缩进。 为了注释文字更具有可读性,合理控制每行的字数,推荐每行80个字符(40个汉字)以内。 提示:通过扩展 emmet 等工具(例如emmet-plus)可以快速输出统一的注释风格。 CSS 文件中有如下几种注

  • 注释 只对存在一定业务逻辑复杂性的代码进行注释 注释并不是必须的,好的代码是能够让人一目了然,不用过多无谓的注释。 反例: function hashIt(data) { // The hash var hash = 0; // Length of string var length = data.length; // Loop through every character

  • 注释 良好的代码自身就是最佳的文档。当你要添加一个注释时,扪心自问,“如何改善代码让它不需要注释?” 改善代码,再写相应文档使之更清楚。 ——Steve McConnell 编写让人一目了然的代码然后忽略这一节的其它部分。我是认真的! 使用英文编写注释。 前导 # 与注释文本之间应当添加一个空格。 注释超过一个单词时,句首字母应当大写,并在语句停顿或结尾处使用标点符号。句号后添加一个空格。 避免无