java - 如何使用类加载器和注释

标签 java kotlin reflection annotations classloader

我正在尝试从方法中获取注释,但遇到了一些麻烦。我正在做的是使用 URLClassLoader 加载一个 jar 文件,然后我使用反射和 Method.getAnnotation 检查该 jar 中类中方法的注释。
我遇到的问题是 Method.getAnnotation 将始终返回 null,即使注释存在(我们可以使用 Method.getAnnotations 看到)。我已经在未使用 URLClassLoader 加载的类上的相同注释类型上测试了相同的过程,它工作正常。
更深入的调查显示 instance.annotationType() 和 MyAnnotation.class 的规范名称是相同的。然而 instance.annotationType().equals(MyAnnotation.class) 返回 false。然而,实例本身是一个代理 (com.sun.proxy)。

有没有一种方法可以在不进行大量思考的情况下获取注释和注释的字段?

instance.annotationType().getMethod("value").invoke(instance)

上面的方法可以解决这个问题,通过对规范名称进行字符串比较来迭代 Method.getAnnotations 的结果可以获得注释,但肯定有更好的方法吗?

还有教育值(value),是什么原因造成的?我的猜测是,这是因为系统类加载器加载的注解类与 URL 类加载器加载的注解类在某种程度上不同。

最佳答案

一个hacky解决方案如下:

代替 AccessibleObject.getAnnotation(Class annotationClass) 使用

private static Annotation getAnnotation(AccessibleObject object, Class annotationClass){
    for(Annotation a : object.getAnnotations()){
        if(a.annotationType().getCanonicalName().equals(annotationClass.getCanonicalName()))
            return a;
    }
    return null;
}

使用 MyAnnotation.value() 代替

private static Object getAnnotationFieldWithReflection(Annotation annotation, String fieldName) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    return annotation.annotationType().getMethod(fieldName).invoke(annotation);
}

关于java - 如何使用类加载器和注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30471062/

相关文章:

.net - 调试 JIT 程序集时读取实例字段

java - 如何将 @RestController 中的请求主体转换为抽象值列表?

java - 如何将具有文本数据类型的数据库字段中的 java 日期 toString 值格式化为 mysql 日期表示形式?

java - Hibernate session get方法返回代理对象

android - 过滤 rxjava 不起作用

java - 如何在 kotlin 中使用 MapBuilder 并添加所有值?

Ruby:将变量导出到本地命名空间

c# - 使用反射调用控件的 Validate() 方法

java - Ldap 单元测试模拟命名枚举

spring-boot - 使用 'spring-boot-starter-oauth2-resource-server' 设置资源服务器时,JwtDecoder bean 不会自动注入(inject)