了解' Annotations'

时间:2018-03-14 12:20:03

标签: java annotations jvm

我试图理解' Annotations' 好一点。 我理解:

为了更好地理解这一点,我创建了一个虚拟问题如下:

  

注释 TestAnnotation1TestAnnotation2TestAnnotation3(问题后面的定义可用)。我想执行类MethodsExecutorClass的方法如下:

     
      
  • TestClass.java编译时,请执行CommonMethod()RetentionPolicySOURCEMethod()
  •   
  • 加载TestClass.class后,执行CommonMethod()RetentionPolicyCLASSMethod()
  •   
  • 每当testMethod() TestClass.java方法执行时,执行CommonMethod()RetentionPolicyRUNTIMEMethod()
  •   

通过这个例子,我想了解以下

  • 我可以指示Java编译器(javac)或Java运行时环境(jvm)来执行我的类中的方法(例如CommonMethod()and RetentionPolicySOURCEMethod(){{1} } MethodsExecutorClass`)。
  • 我可以将监控(即搜索使用我的注释等的方法/类)委托给任何其他实体(可在Java SE中使用)。
  • 我想做methods of@Override注释。我们不做额外的事情。虽然on Oracle javadoc site, here 明确提到,但 Java平台始终具有各种ad hoc注释机制。@deprecated就是其中之一。但我想知道我能不能做这样的事情。

定义应如下所示:

MyAnnotations.java

@deprecated

MethodsExecutorClass.java

@Retention(RetentionPolicy.SOURCE)
public @interface TestAnnotation1 
{
  String className();
}

@Retention(RetentionPolicy.CLASS)
public @interface TestAnnotation2 
{
  String className();
}

@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation3 
{
  String className();
  String methodName();
}

TestClass.java

class MethodsExecutorClass
{
    public static void CommonMethod()
    {
        System.out.println("In method: CommonMethod()");
    }

    public void RetentionPolicySOURCEMethod()
    {
        System.out.println("In method: RetentionPolicySOURCEMethod()");
        //Also print annotation arguments e.g. Class name etc
    }

    public void RetentionPolicyCLASSMethod()
    {
        System.out.println("In method: RetentionPolicyCLASSMethod()");
        //Also print annotation arguments e.g. Class name etc
    }

    public void RetentionPolicyRUNTIMEMethod()
    {
        System.out.println("In method: RetentionPolicyRUNTIMEMethod()");
        //Also print annotation arguments e.g. Class name etc
    }
}

你能帮助我实现这个目标吗? (请不要猜测或假设,但推定也会有所帮助) 我不确定这是否可以实现,但期待。

1 个答案:

答案 0 :(得分:0)

保留策略RetentionPolicy.SOURCE的注释仅在代码编译期间可用,因此编译器应支持您的注释使用它,否则无法处理注释。通常,此类注释用于在编译时检测可能的问题,例如注释@Override。这就是为什么你的第一个问题无法以通常的方式实施的原因。

保留策略RetentionPolicy.CLASS的注释仅在.class文件中可用,并且可以通过JVM使用。请参阅this answer如何使用它。第二个问题也无法通过标准方式实施。

常用注释具有保留策略RetentionPolicy.RUNTIME,可通过Java中的reflection mechanism获得。但要解决您的第三个问题,您必须使用一些方法调用拦截器,例如,通过Aspect Oriented Programming。之后,您可以通过method.getDeclaredAnnotations()获取方法的注释。

  

我可以指示Java编译器(javac)或Java运行时环境(jvm)吗?   在我班上执行一个方法(例如   的commonMethod()andRetentionPolicySOURCEMethod()方法   ofMethodsExecutorClass`)。

不,你不能。

  

我可以委派监控(即搜索方法/类   正在使用我的注释等)到任何其他实体(即   可在Java SE中获得。

您可以通过AOP执行此操作,例如,使用库AspectJ