欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

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

来源: javaer 分享于  点击 44881 次 点评:205

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


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代理不可以对类进行代理,只能针对接口代理。

相关栏目:

用户点评