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