gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:40:16 24 4
gpt4 key购买 nike

我正在尝试转换此 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com