【问题标题】:working of Java AnnotationsJava注释的工作
【发布时间】:2014-05-19 09:30:19
【问题描述】:

我想知道我的判断是否正确。我一直在阅读有关注释的内容,并想知道所有魔术是如何发生的。这就是我认为会发生的事情。否则请告知。

首先,让我们做一些注释。说AssertTrue。现在,注释的规格在javax.validation.constraints 中提供。现在,因此,AssertTrue 并没有真正做任何事情。即如果我要执行以下操作

public class MyClass{
 @AssertTrue(message = "MyMessage")
 public myMethod(){
 //something
 }
}

现在,这段特殊的代码除了保存元数据信息之外什么都不会做,在这个方法 myMethod 我有一些额外的信息,即消息和注释。我如何使用这些信息取决于我。

这就是hibernate-validator框架出现的地方。

它的作用是,它提供了一堆类,并接收应该被验证的对象。在该对象上,它将检查 AssertTrue 注释是否存在。如果找到,它将调用AssertTrueImpl 的实现中提供的方法isValid

这是怎么回事?

另外,我有几个问题。假设我有自己的自定义注释,并且我想提供一个检查某些内容的框架。为了争论,假设我想做hibernate-validator正在做的事情。现在该怎么做呢?

另外,当JVM遇到一些注解时,幕后会发生什么?它是否在寻找一些实现?它到底在寻找什么?

即如果在我的代码中遇到AssertTrue,JVM 会做什么。当然,它不需要做太多事情,只需要存储一些信息,而且它也不必去寻找任何实现,因为每当我调用 validator.validate() 时,它都会寻找 hibernate-validator 实现。

如果我理解正确,请告诉我。

【问题讨论】:

  • 您在这里的一个问题太多了,但您大体上是正确的:注释只是由库在编译或运行时读取(查看不同的保留选项),然后对类进行操作,一般使用反射。 JVM 不会主动对注解做任何事情;您需要运行一些库来查找它们。

标签: java hibernate validation annotations


【解决方案1】:

你是对的。注释本身什么都不做,它只是可以被处理工具使用的元数据。在这种情况下,Hibernate 验证器。

这些工具的通常过程是在类路径上扫描哪些类具有可用于构建或增强类的元数据(通过注入代理、注册拦截器或任何其他类型的操作)。他们要么扫描类路径,要么通过外部配置机制(xml、json、配置类 [Spring 方式] 上的注释)为框架指定这一点,以便它知道在哪里寻找带注释的类。

因此,您也可以按照相同的发现方法从项目中的注释中受益。事实上,如果您碰巧使用 CDI,您可能会经常使用它们。它们对于 bean 拦截或在您的类上提供元数据非常有用,否则这些元数据必须使用大量样板代码进行处理。

我鼓励你大量使用它们。

干杯!

【讨论】:

    【解决方案2】:

    您正确理解注释 - 它们只是 specific members 上的元数据(字段、方法、类...)。其中一些用于compile time only,其中一些用于运行时。后者将通过Reflection API 提供(基本上在带注释的成员上形成额外的元数据)。您可以使用此功能执行多种操作,其中由 JSR-303 定义的声明式验证(并由 Hibernate Validator 实现)只是其中之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 2014-12-27
      • 1970-01-01
      • 2016-07-22
      • 2012-12-06
      • 1970-01-01
      相关资源
      最近更新 更多