IMy 的问题涉及使用动态代理和 java 泛型进行类型转换的行为。更具体地说,我想使用动态代理来检测一个 serverlet 对象。为了更好的重用性,我采用了一些通用代码模板来创建代理对象,如下所示。
@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 是我实现 MyServelet 接口的具体 serverlet 实现类。但是,如果我运行上述方法,它会打印出来
proxy class class com.sun.proxy.$Proxy0
input class class MyServeletImplementation
所以我想知道代码片段中的类型转换语句发生了什么。似乎它悄悄地失败了,因为代理没有被强制转换为 MyServeletImplementation,但它也没有抛出 ClassCastException。有人可以帮我解释一下吗?谢谢!