Exception in thread "main" java.lang.ClassCastException: $Proxy0 利用匿名内部类创建InvocationHandler接口实现
来源:互联网 发布:淘宝女裤秋装 编辑:程序博客网 时间:2024/06/10 07:38
这里错误的描述大致为:不能将动态代理的返回对象强转为对应的类!
对于这个错误,最终原因还是没弄清楚,但是最后发现了错误的根源,再次跟大家分享一下!先贴出整个创建动态代理类需要的类以及接口。值得注意的是,这里介绍的是实现接口的类的动态代理,没有实现接口的动态代理怎么实现,参照高手的博客。
1、Caculate.java接口
package com.lds.util;public interface Calculate { public int add(int i, int j); public int sub(int i, int j); public int mul(int i, int j); public float div(int i, int j);}
2、Caculate接口的实现类CaculateImp.java
package com.lds.util;public class CalculateImp implements Calculate { @Override public int add(int i, int j) { int result = i + j; return result; } @Override public int sub(int i, int j) { int result = i - j; return result; } @Override public int mul(int i, int j) { int result = i * j; return result; } @Override public float div(int i, int j) { float result = (float) i / j; return result; }}
3、创建动态代理的实例对象
package com.lds.util;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class ProxyTest { public static void main(String args[]) { final CalculateImp target = new CalculateImp(); Calculate proxy = (Calculate) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),new InvocationHandler() { @Override public Object invoke(Object proxy, Method method,Object[] args) throws Throwable { System.out.println("Before method excute "); Object result = method.invoke(target, args); System.out.println(result); System.out.println("After Method excute " + "\n"); return result; }}); proxy.add(1, 2); proxy.sub(4, 3); proxy.mul(2, 2); proxy.div(3, 2); }}
后来发现出错的地方就是这里:
Calculate proxy = (Calculate) Proxy.newProxyInstance
在上面的强转中,强转类型不能写成Calculate接口的实现类CalculateImp,而只能写成接口类型,否则会报上面的错;之前检查错误,从来没想到这个问题,后来仔细想想,转成接口类型,应该是很有道理的,而不能转成接口实现类类型。
因为对于Calculate接口,可以被任何类实现,实现之后的类型仍然可以写成接口类型,在java中会自动进行转换成对应的实现类类型。这样的例子比如:
List<?> list = new ArrayList<?>();
看到这里的List类型也就应该明白了,当然这个List可以换成ArrayList。
ArrayList<Integer> list = new ArrayList<Integer>();
从上面的实例也可以看出来,创建代理类后,实现类CalculateImp中的方法与InvocationHandler的实现类中的invoke()方法的执行顺序,是先执行invoke()方法。
上述的一点心得仅代表个人观点,或许有不对的地方,希望各位大虾可以指正,互相学习进步。
0 0
- Exception in thread "main" java.lang.ClassCastException: $Proxy0 利用匿名内部类创建InvocationHandler接口实现
- Exception in thread "main" java.lang.ClassCastException
- Spring使用Aop出现了Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot
- Exception in thread "main" java.lang.ClassCastException: $Proxy13
- Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lan
- Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljav
- Exception in thread "main" java.lang.ClassCastException: java.math.BigDecimal cannot be cast to ja
- Exception in thread "main" java.lang.ClassCastException: oracle.jdbc.driver.T4CConnection cannot be
- 关于反编译apk出现Exception in thread "main" java.lang.ClassCastException: ....
- Exception in thread "main" java.lang.NoClassDefFoundError
- Exception in thread "main" java.lang.NoClassDefFoundError
- Exception in thread "main" java.lang.NoClassDefFoundError
- Exception in thread "main" java.lang.NoClassDefFoundError
- Exception in thread "main" java.lang.NoClassDefFoundError:
- Exception in thread "main" java.lang.NoClassDefFoundError
- Exception in thread "main" java.lang.NoClassDefFoundError
- Exception in thread "main" java.lang.NoClassDefFoundError
- Exception in thread "main" java.lang.NoClassDefFoundError
- RBPF
- Python 实现的冒泡排序
- 十一周——继承与派生——项目二 摩托车继承自行车和机动车
- multiset和set的用法区别1
- memcached监控的几种方法(nagios等)
- Exception in thread "main" java.lang.ClassCastException: $Proxy0 利用匿名内部类创建InvocationHandler接口实现
- Java第二次作业:数据库的访问
- 第十二周项目一 教师兼干部类(多重继承)
- 摆摊的都进来,送你几句话。
- 新导入的安卓项目中文乱码解决终极办法
- memcached运行情况监测
- Android之——任意时刻从子线程切换到主线程的实现(插曲)
- 黑马程序员-----------java基础知识(一)
- Notepad++ 快捷键 大全