【问题标题】:Java method parameter for only annotated class仅用于注释类的 Java 方法参数
【发布时间】:2020-02-28 09:09:36
【问题描述】:

我希望我选择了一个尽可能清晰的标题。 我有用自定义注释注释的类

@MyAnnotation
public class MyClass1 {
   //...
}
@MyAnnotation
public class MyClass2 {
   //...
}

我有另一个类,我想用两个同名的方法来丰富它: 一种方法只接受注解的类作为参数,另一种方法接受其他类作为参数

public class MyOtherClass {
   public void myMethod(Object obj) {
       //.....
   }
   public void myMethod (@MyAnnotation Object obj) {
       // this method is applied for only classes annotated with @MyAnnotation
   }
}

我知道public void myMethod (@MyAnnotation Object obj) 是一种错误的方式,我们不能将注释作为参数传递。但我想找到合适的方法来处理这种需求。

【问题讨论】:

  • 为什么方法只能取带注解的类?使用接口代替注解不会达到同样的目的吗?
  • 我认为注释是区分我的类的正确方法,特别是因为我目前不需要我的类的接口
  • 这里更重要的问题是为什么? 为什么需要区分类?他们有什么不同?如果一组类确实可以做另一组不能做的事情,那么你需要一个接口。如果两组类实际上是相同的,那么您的方法可以同时接受它们。

标签: java annotations


【解决方案1】:

您可以有一个 myMethod(Object obj) 并在其中手动检查传递给此方法的 obj 是否带有 @MyAnnotation 注释(假设保留策略是在运行时保留它)。然后根据结果将调用分派给private void processAnnotated(Object obj)private void processNotAnnotated(Object obj)

public void myMethod(Object obj) {
  if (obj != null && obj.getClass().isAnnotationPresent(MyAnnotation.class))  {
    processAnnottated(obj);
  } else {
    processNotAnnottated(obj);
  }
}

【讨论】:

  • 我想到了这个解决方案,但我想确保没有其他方法可以更简单,并且不需要在我的方法中进行测试。
  • 然后做一个标记界面,而不是注解。
【解决方案2】:

我不确定您要达到的目标。正如您所说,您不能注释参数。您可以将注释标记为运行时,但是您只能通过反射检查注释是否存在。因此,您可以通过调用私有验证方法 validateMyAnnotationIsSet(parameter) 来启动 myMethod,该方法检查是否在给定类上设置了注释。

也许使用 MarkerInterface 会更好。您可以创建该类可能实现也可能不实现的空接口。在您的方法中,您可以接受该接口作为参数,然后执行“instanceof”和强制转换以继续使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多