Java8中使用泛型通过反射获得注解的BUG如何解决?

新手上路,请多包涵
public class Java8Test {
    public static void main(String[] args) {
        Class<B> b = B.class;
        Method[] methods = b.getMethods();
        for (Method method : methods) {
            Annotation resource = method.getAnnotation(Resource.class);
            if (resource != null) {
                System.out.println(method);
            }
        }
    }
}

class A<T extends Object> {

    void print(T t) {
    }
}

class B extends A<String> {
    @Resource
    public void print(String s) {

    }
}

在Java8中输出结果是:
public void com.test.java8.B.print(java.lang.String)
public void com.test.java8.B.print(java.lang.Object)

在Java6和Java7中输出结果是
public void com.test.java8.B.print(java.lang.String)

Java每次升级都不兼容,真是无语了。

阅读 4.7k
3 个回答
新手上路,请多包涵

我今天也遇到这个问题,spring里通过方法(含有泛型参数且是重写)自动注入失败,因为spring通过反射获取带有注解的方法和字段,满足上述条件的方法会被获得两次,类似于这样:

public void com.test.java8.B.print(java.lang.String)
public void com.test.java8.B.print(java.lang.Otring)

由于public void com.test.java8.B.print(java.lang.Object)参数类型范围太大,无法获得唯一bean,注入失败

泛型在运行阶段擦除,实际上通过类中隐式的桥接方法,自动将obj类型转换为目标类型,看下B类的字节码,就知道了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题