静态代理,代理类(壳子)和被代理类(真实的类)定义公共的接口,将被代理类(真实的类)的引用传入代理类(壳子),通过代理类(壳子)来调用被代理类(真实的类)的真实方法。动态代理则需要实现InvocationHandler接口,通过Proxy.newProxyInstance的方法来创建代理对象。
/**
* 定义代理类和被代理类的公共接口
* @author zhangej
*
*/
public interface ProxyInterface {
public void method1();
public void method2();
}
/**
* 被代理的对象(真正的远程对象)
* @author zhangej
*
*/
public class RealObject implements ProxyInterface {
@Override
public void method1() {
// TODO Auto-generated method stub
System.out.println("RealObject 调用了 method1");
}
@Override
public void method2() {
// TODO Auto-generated method stub
System.out.println("RealObject 调用了 method2");
}
}
/**
* 代理对象(壳子对象)
* @author zhangej
*
*/
public class ProxyObject implements ProxyInterface {
private ProxyInterface mProxyInterface;
public ProxyObject(ProxyInterface proxyInterface){
mProxyInterface = proxyInterface;
}
@Override
public void method1() {
// TODO Auto-generated method stub
mProxyInterface.method1();
}
@Override
public void method2() {
// TODO Auto-generated method stub
mProxyInterface.method2();
}
}
/**
* 动态代理实现的handler
* @author zhangej
*
*/
public class DynamicProxyObject implements InvocationHandler{
private Object mObject;
public DynamicProxyObject(Object obj) {
mObject = obj;
}
/**
* proxy: 指代我们所代理的那个真实对象
* method: 指代的是我们所要调用真实对象的某个方法的Method对象
* args: 指代的是调用真实对象某个方法时接受的参数
*
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
// 调用被代理类对象的方法
Object result = method.invoke(mObject, args);
return result;
}
}
/**
* 静态代理和动态代理调用方式
* @author zhangej
*
*/
public class Main {
public static void main(String[] args) {
ProxyInterface realObject = new RealObject();
// //静态代理
ProxyObject proxyObject = new ProxyObject(realObject);
proxyObject.method1();
proxyObject.method2();
//动态代理
//我们要代理哪个真实对象,就将该对象传进去,最后是通过该真实对象来调用其方法的
InvocationHandler handler = new DynamicProxyObject(realObject);
/*loader:一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
interfaces:一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口
handler:一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上*/
ProxyInterface dynamicProxy = (ProxyInterface) Proxy.newProxyInstance(ProxyInterface.class.getClassLoader(),
new Class[] { ProxyInterface.class },
handler);
dynamicProxy.method1();
dynamicProxy.method2();
}
}