频道栏目
首页 > 资讯 > Java > 正文

Java动态代理类抛出java.lang.ClassCastException异常的问题分析和整理

18-07-17        来源:[db:作者]  
收藏   我要投稿

Java中自带的动态代理InvocationHandler接口、Proxy类只能针对接口进行动态代理,如果要对类进行代理可以使用第三方的类库像CGLIG等相关对字节码操作实现的类库;

下面我们可以看一下使用Java动态代理代理类会发生什么异常:

创建一个接口类ProxyPeople

package com.test.Application;

public class ProxyPeople {

 public String work(String name) {
  System.out.println("工作名称是==》"+name);
  return name;
 }
}

创建一个代理类的调用处理程序ProxyHandler

package com.test.Application;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class ProxyHandler implements InvocationHandler{

 private Object obj;

 public ProxyHandler(Object obj) {
this.obj = obj;
 }
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

  return method.invoke(obj, args);
 }

}

客户端程序调用类中的work方法

package com.test.Application;

import java.lang.reflect.Proxy;

public class Test1 {

 public static void main(String[] args) {
  ProxyPeople people = new ProxyPeople();

  ProxyHandler handler = new ProxyHandler(people);
  ProxyPeople proxy = (ProxyPeople)Proxy.newProxyInstance(handler.getClass().getClassLoader(), people.getClass().getInterfaces(), handler);

  Object obj = proxy.work("财务");
  System.out.println(obj);
 }
}

运行客户端程序将会抛出类转换异常

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to com.test.Application.ProxyPeople
 at com.test.Application.Test1.main(Test1.java:11)

这个示例也说明了Java代理不可以对类进行代理,只能针对接口代理。

相关TAG标签
上一篇:protobuf序列化协议python教程
下一篇:MYSQL存储过程的调试过程追踪方法
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站