0

我想了解这个问题

public class DogController extends FeedCommonController<DogModel extends CommonAnimalModel, FARMER_1_AUTH> {
  // something

 // This is working - but there is duplication
  @Security.Authenticated(FARMER_1_AUTH.class)
  public boolean feed_it() {
    // nothing special
    DogModel.getRandom().feed_it();
  }
}

public class CatController extends FeedCommonController<CatModel extends CommonAnimalModel, FARMER_2_AUTH> {
  // something

  // This is working - but there is duplication 
  @Security.Authenticated(FARMER_2_AUTH.class)
  public boolean feed_it() {
    // nothing special
     CatModel.getRandom().feed_it();
  }
}

我想简化代码并删除重复的方法,但我不能将 Class 类型添加到注释中。

public abstract class CommonAnimalController< T extends CommonAnimalModel, XXXXXX> {

   @Security.Authenticated(XXXXXX.class) // <-- Here is a problem with declaration 
   public boolean feed_it() {
      T.getRandom().feed_it();
   }

} 
/**
Get Token From HTTP Request from Actual Thread
*/
public class Security {

  @With(AuthenticatedAction.class)
  @Target({ElementType.TYPE, ElementType.METHOD})
  @Retention(RetentionPolicy.RUNTIME)
  public @interface Authenticated {
    Class<? extends Authenticator> value() default Authenticator.class;
  }

}


带有注释的概念已经在数百个类上创建和实现。所以它不可能做出巨大的改变。但它的一些优雅的方式如何解决这个问题?

4

1 回答 1

0

你在一个问题中有两个问题。
您遇到的第一个问题是:如何获取泛型类型 T 的类实例
这在这里得到了回答:如何获取泛型类型 T 的类实例

您遇到的第二个问题是如何避免将常量传递给注释。
您将遇到编译错误“属性值必须是常量”
对于第二个问题,似乎没有简单的方法可以在 Java 中实现它。(我错了)
看到这个答案:How to provide value to an annotation from a Constant java

问题解决方案1

public abstract class CommonAnimalController<T extends CommonAnimalModel, XXXXXX> {
    final Class<XXXXXX> typeParameterClass;

    public CommonAnimalController(Class<XXXXXX> typeParameterClass) {
        this.typeParameterClass = typeParameterClass;
    }
    @Security.Authenticated(typeParameterClass)  // you will have "Attribute value must be constant"
    public boolean feed_it() {
        return T.getRandom().feed_it();
    }
}
于 2019-11-23T17:55:26.273 回答