java - 无法调用需要 java.lang.Class 参数的方法?

标签 java grails groovy annotations closures

我正在尝试转换此 ControllerAnnotationHelper进入服务,我遇到了奇怪的问题。

No signature of method AnnotationScannerService.findAnnotatedClosures() is applicable for argument types:
(java.lang.Class, java.lang.Class) values: [class MyController, interface MyAnnotationRequired]

原始方法如下:

private static Map<String, List<Class>> findAnnotatedClosures(
      Class clazz, Class... annotationClasses) {
   def map = [:]
   for (field in clazz.declaredFields) {
      def fieldAnnotations = []
      for (annotationClass in annotationClasses) {
         if (field.isAnnotationPresent(annotationClass)) {
            fieldAnnotations << annotationClass
         }
      }
      if (fieldAnnotations) {
         map[field.name] = fieldAnnotations
      }
   }

   return map
}

还有我的:

protected Map<String, List<Class>> findAnnotatedClosures(Class clazz, Class... annotationClasses) {
   def map = [:]
   for (field in clazz.declaredFields) {
      def fieldAnnotations = []
      for (annotationClass in annotationClasses) {
         if (field.isAnnotationPresent(annotationClass)) {
            fieldAnnotations << annotationClass
         }
      }
      if (fieldAnnotations) {
         map[field.name] = fieldAnnotations
      }
   }

   return map
}

通过调用:

public void test_findAnnotatedClosures() {
   Map<String, List<Class>> annotatedClosures =
        annotationScannerService.findAnnotatedClosures(MyController, MyRequiredAnnotation)
}

如何声明这个方法,以便我可以使用 Controller 类和各种注释接口(interface)的类来调用它?

最佳答案

服务中的非公共(public)方法通常没有多大意义。特别是在 Grails 中,这会出现问题,因为默认情况下服务是事务性的,因此您将使用的实例将是代理。

仅代理公共(public)方法。 protected 方法是有效的,但通常仅在类或子/父类(super class)中进行子类化和调用时使用。

所以它归结为 Groovy/Spring 的事情。我们习惯了 Groovy 对访问规则不严格,但 Grails 服务几乎纯粹是 Spring bean - Grails 只是让您在 Groovy 中编写它们,自动创建关联的 Spring bean,并自动使它们成为事务性的(除非禁用)。

使方法静态也有效,因为您绕过代理并直接进入真正的类,并且 Groovy 允许您调用它,即使它是 protected 。

关于java - 无法调用需要 java.lang.Class 参数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7352580/

相关文章:

java - 如何在浏览器中显示PDF文件

java - OpenShift 上的 Web 套接字断开连接(使用 WildFly 8.2.1)

java - 在编辑器上绘图时卡住 UI

grails - 使用 'like'的Grails搜索列表

java - 使用 spock stub 动态查找器

java - JScrollPane:Blinker(光标)被边框覆盖

database - 如何在 Liquibase 迁移中的 sql 中插入 html 标签?

grails - Grails 最佳实践资源

rest - 保存前Grails更新模型

grails - 使用 Grails 进行长轮询