作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题涉及动态代理和 java 泛型的类型转换行为。更具体地说,我想使用动态代理来检测servlet对象。为了更好的可重用性,我采用了一些通用代码模板来创建代理对象,如下所示。
@SuppressWarnings("unchecked")
public static <T> T instrument(final T aT) {
T proxy = (T) Proxy.newProxyInstance(aT.getClass().getClassLoader(), new Class[]{MyServelet.class}, new InvocationHandler() {
@Override
public Object invoke(Object aProxy, Method aMethod, Object[] aArgs) throws Throwable {
..... instrumentation logic goes here
}
});
System.out.println("proxy class " + proxy.getClass());
System.out.println("input class " + aT.getClass());
return proxy;
}
这里T是我的具体servlet实现类,它实现了MyServelet接口(interface)。但是,如果我运行上述方法,它会打印出来
proxy class class com.sun.proxy.$Proxy0
input class class MyServeletImplementation
所以我想知道代码片段中的类型转换语句发生了什么。看起来它悄悄地失败了,因为代理没有被转换为 MyServeletImplementation,但它也没有抛出 ClassCastException。有人可以帮我解释一下吗?谢谢!
最佳答案
在该方法的实际编译字节码中没有发生转换,因为 type erasure .
生成字节码时,编译器将参数类型的任何变量视为与该参数类型的上限具有相同的类型,即 Object
如果类型是无界的。所以如果 T
在你的方法中有约束 <T extends MyServelet>
,编译器会处理 proxy
作为 MyServelet
类型的变量,并插入了石膏。然而,如T
是无界的,它被视为 Object
类型的变量- 因此,没有类型转换。
关于java - 使用动态代理和 java 泛型进行类型转换静默失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19849208/
我是一名优秀的程序员,十分优秀!