静态代理:
package com.text.sgl;
/**
* 静态代理
* @author shen.guoliang
* @version 1.0, 2017年8月27日 每次修改后更新版本号,日期和修改内容
* @see [相关类/方法]
* @since [产品/模块版本]
*/
interface ClothFactory{
//制作衣服
public void dowork();
}
//被代理对象
class NakeCloth implements ClothFactory{
@Override
public void dowork() {
System.out.println("耐克生产的衣服!");
}
}
//代理类
class DailiCloth implements ClothFactory{
NakeCloth nc;
@Override
public void dowork() {
nc.dowork();
}
public DailiCloth(NakeCloth nc){
this.nc = nc;
}
}
public class StaticText {
public static void main(String[] args) {
NakeCloth nc = new NakeCloth();
DailiCloth dc = new DailiCloth(nc);
dc.dowork();
}
}
动态代理:
package com.text.sgl;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 反射机制动态代理实例
* @author shen.guoliang
* @version 1.0, 2017年8月27日 每次修改后更新版本号,日期和修改内容
* @see [相关类/方法]
* @since [产品/模块版本]
*/
//动态代理的使用
//(这是将被实现的接口实例)
interface Subject{
//抽象方法
void action();
}
//被代理类
class RealSubject implements Subject{
@Override
public void action() {
System.out.println("我是被代理类,记得执行我奥!");
}
}
//实现InvocationHandler接口的对象,用来动态生成代理类的对象等
class MyInvocationHandler implements InvocationHandler{
Object obj;//实现了接口的被代理类对象的声明
//1:给被代理类对象实例化 2:返回一个代理类对象
public Object blind(Object obj){
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
//当通过代理类的对象发起被重写的方法的调用时,都会转换为对如下的invoke方法的调用
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//method方法的返回值是value
Object value = method.invoke(obj, args);
return value;
}
}
public class TestProxy {
public static void main(String[] args) {
//创建一个被代理类对象
RealSubject rs = new RealSubject();
//创建一个实现了InvocationHandler接口的自动生成代理类工具类对象
MyInvocationHandler mh = new MyInvocationHandler();
//调用blind()方法,动态返回一个实现Subject接口的代理类对象
Object obj = mh.blind(rs);
//强转
Subject sbj = (Subject)obj;
//执行action()方法其实转到对InvocationHandler接口的实现类的invoke()方法的调用,实际还是调的被代理对象重写的action()的方法,从而实现动态代理
sbj.action();
}
}