动态代理与静态代理
静态代理例程如下:
package com.atscnu;
interface ClothFactory{
void produce();
}
class NikeClothFactory implements ClothFactory{
@Override
public void produce() {
System.out.println("Nike 生成鞋子");
}
}
class StaticProxy implements ClothFactory{
ClothFactory clothFactory;
public StaticProxy(ClothFactory clothFactory){
this.clothFactory = clothFactory;
}
@Override
public void produce() {
System.out.println("代理类开始进行代理!!");
clothFactory.produce();
}
}
public class TestStaticProxy {
public static void main(String[] args) {
NikeClothFactory nikeClothFactory = new NikeClothFactory();
StaticProxy staticProxy = new StaticProxy(nikeClothFactory);
staticProxy.produce();
}
}
动态代理例程:
package com.atscnu;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Subject{
void info();
}
class RealSubject implements Subject{ //被代理类实现接口
@Override
public void info() {
System.out.println("我是被代理类,我要被执行!!!");
}
}
//代理类实现InvocationHandler接口
class MyProxyHandle implements InvocationHandler{
Object object;
// 1. 对被代理类实例化;2. 返回一个代理类对象
public Object realProxy(Object object){
this.object = object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
}
// 当通过代理类对重写的方法进行调用的时候,都会调用下面这个方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(object, args);
return invoke;
}
}
public class TestDynamicProxy {
public static void main(String[] args) {
// 创建一个被代理类对象
RealSubject realSubject = new RealSubject();
// 创建一个实现InnovationHandler接口的对象
MyProxyHandle myProxyHandle = new MyProxyHandle();
// 调用realProxy方法,返回一个同样实现了Subject接口的对象,即代理类的对象,此时o为代理类对象
Object o = myProxyHandle.realProxy(realSubject);
Subject myProxyHandle1 = (Subject)o;
// 转到对invoke方法的调用
myProxyHandle1.info();
// 例子2
NikeClothFactory nikeClothFactory = new NikeClothFactory();
MyProxyHandle myProxyHandle2 = new MyProxyHandle();
ClothFactory clothFactory = (ClothFactory)myProxyHandle2.realProxy(nikeClothFactory);
clothFactory.produce();
}
}