当前位置: 首页 > 知识库问答 >
问题:

Java反射:即使存在注释也找不到

柯昆
2023-03-14

我正在使用反射在类中查找方法,并获得注释“Permes siNecessari”,该注释描述了方法实现的操作类型(CREATE,DELETE,...)。

这是一个实现picketlink类PathAuthorzer的授权检查。我得到一个叫做url,我把它拆分,从url中我找到了实现网络服务的类。然后我搜索它将被调用的方法,并阅读它使用的操作类型。

这是搜索方法的一部分:

Class facadeinterface = Class.forName(pm); // get the interface
Method metodo = getMetodoClasse(facadeinterface, metodoRest); // find method with @Path annotation
if(metodo != null){
   PermessiNecessari rp = metodo.getAnnotation(PermessiNecessari.class);

   if(rp != null){ // caso metodo con permessi
       return checkPermessiModulo(m, rp);
   }

   if(metodo.isAnnotationPresent(NonProtetto.class)){ 
       return true;
   }
   LOG.log(Level.WARNING, "Metodo trovato : {0}/{1}, ma non annotato!", new Object[]{metodoRest,metodo});

对于istance,这是选中的类:

public interface VlpgmoduliManagerFacadeRemote 
   extends InterfacciaFacadeRemote<Vlpgmoduli>{

  @POST 
  @javax.ws.rs.Path("getpermessimoduligruppo")
  @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
  @Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
  @PermessiNecessari(operation = STANDARD_OP.READ)
  public GridResponse<Vlpgmoduli> getPermessiModuliGruppo(MultivaluedMap<String, String> formParams, 
        String callback) 
        throws BadRequestException;
...

该方法可以通过@javax找到。ws。但是当我想得到“PermessiNecessari”注释时,却找不到这个注释!

PS:在其他课程中,这个系统运行良好。父接口中的方法也找不到!尝试使用扩展同一接口的另一个接口,并找到所有方法(继承的方法)。

这是我的注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermessiNecessari {    
    Class resourceClass() default void.class;
    String operation() default "";
    String modulo() default "";
}

以下是搜索实现web服务的方法的方法:

private Method getMetodoClasse(Class facade, String metodo){
    for(Method method : facade.getMethods()){
        Path p = method.getAnnotation(Path.class);
        if(p != null && ( p.value().equals(metodo) || p.value().equals("/"+metodo) )){
            return method;
        }
    }
    for (Class c : facade.getInterfaces()) {
        for (Method method : c.getDeclaredMethods()) {
            Path p = method.getAnnotation(Path.class);
            if(p != null && ( p.value().equals(metodo) || p.value().equals("/"+metodo) )){
                return method;
            }
        }
    }
    return null;
}

编辑:这不是注释的问题。我试着用这张支票:

public boolean haAnnotazione(Method method, Class annotationType){
    Annotation annotazioni[] = method.getAnnotations();
    for(Annotation a : annotazioni){
      if(a.annotationType().getName().equals(annotationType.getName())){
            return true;
        }
    }
    return false;
}

如果我使用a.annotationType(). equals(annotationType)它返回false,即使它们是相同的;如果我使用类的名称,它的工作!

也许是类加载器的问题?该软件在Wildfly中运行。

共有2个答案

薛高澹
2023-03-14

@PermessiNecessari必须是运行时保留的,因为如果保留不同,编译器将删除字节码中不包含有关该注释的信息。

这就是为什么在运行时找不到注释--它不在那里。

伯建安
2023-03-14

解决了的!

这是一个依赖错误。项目中有两个不同版本的依赖项,所以加载的注释实际上是两个不同的类。

下一次:检查你的pom。如果有一些强制转换异常,或者两个相等的类不相等,则可以使用xml来表示不同的依赖项。

...真的没有解决,EAR/lib和WAR/lib中的类之间存在类装入器问题,但这是另一个问题

 类似资料:
  • 但是,由于某种原因,总是,所以我不确定这是注释类的问题还是我使用反射的方式的问题。我很确定是后者,因为在调试时,我发现它能够访问带有注释的方法。如有任何帮助,不胜感激,谢谢!

  • 问题内容: 我想在我的小型项目中添加一个测试(请注意,我从代码中删除了一些位并更改了程序包名称,因此,如果您看到与此有关的任何错误,则可能不是;)): (我也尝试从TestCase进行扩展以删除静态导入,但这没有帮助) 运行后,向我显示一个找不到org.junit的错误: 我的pom.xml看起来像这样: mvn依赖项:tree: mvn版本: 请注意,我不是Java专家也不是maven专家,只是

  • 问题内容: 这是一个测试类: 这是我的输出: 我缺少通过反射使注释可见的什么? 我是否仅需要检查它们的存在就需要注释处理器? 问题答案: 为了在运行时访问注释,它需要具有运行时的保留策略。 否则,注释将被丢弃,并且JVM无法识别它们。 有关更多信息,请参见此处。

  • 我使用的库使用类型使用注释向变量添加约束。例如,如果您想要一个可配置的不透明度(以百分比为单位,由表示),您需要注释类型: 我不能让同一个库工作在相同的kotlin代码。 为了简化问题,让我们自己声明注释和用法: 运行会产生,表明类型上存在注释。 如果我们引入一个新的kotlin类,具有类似的字段和注释类型: 之前的检查,现在在类上: 产生,指示JavaAnnot注释不存在于类型的上,尽管我们显然

  • 问题内容: 我的编译器无法找到 HttpServletRequest getServletContext() 方法。 我没有做任何太复杂的事情: 我尝试过的一些故障排除: 发现该方法是在2.3中创建的,因此我包含了一个反映该方法的JAR(并将其包含在我的Eclipse构建路径中) 我在 build.xml 类路径中包含了JAR 。 当我使用Eclipse时,可以找到该方法,但是当我尝试构建类时,会

  • https://github.com/thtrieu/darkflow 在Ubuntu 20.04 我认为我的flow文件有问题,所以我试图通过以下代码重建构建文件 这就是我得到的。 设置。py:6:弃用警告:imp模块已弃用,取而代之的是importlib;有关导入imp运行build_ext building“暗流”的替代用途,请参阅模块文档。cython_utils。nms的扩展名x86_6