我试图理解' Annotations' 好一点。 我理解:
为了更好地理解这一点,我创建了一个虚拟问题如下:
有注释
TestAnnotation1
,TestAnnotation2
,TestAnnotation3
(问题后面的定义可用)。我想执行类MethodsExecutorClass
的方法如下:
- 当
TestClass.java
编译时,请执行CommonMethod()
和RetentionPolicySOURCEMethod()
- 加载
TestClass.class
后,执行CommonMethod()
和RetentionPolicyCLASSMethod()
- 每当
testMethod()
TestClass.java
方法执行时,执行CommonMethod()
和RetentionPolicyRUNTIMEMethod()
通过这个例子,我想了解以下:
javac
)或Java运行时环境(jvm
)来执行我的类中的方法(例如CommonMethod()and
RetentionPolicySOURCEMethod(){{1} } MethodsExecutorClass`)。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
}
}
你能帮助我实现这个目标吗? (请不要猜测或假设,但推定也会有所帮助) 我不确定这是否可以实现,但期待。
答案 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。