Java中的代理模式

代理模式分为两种:静态代理和动态代理

/**
 * 自定义一个接口
 */
public interface Hello {

    public void say(String name);

}

/**
 * 自定义的接口的一个实现类
 */
public class HelloImp implements Hello {

    @Override
    public void say(String name) {
        System.out.println("hello-->"+name);
    }

}

静态代理:静态代理中的代理类,需要我们自己写(需要事先写好代理类)

/**
 * 静态代理;
 */
public class StaticProxy implements Hello {
    private Hello hello;

    public StaticProxy() {
        hello = new HelloImp();
    }

    public void before(){
        System.out.println("----------------->before");
    }

    public void after(){
        System.out.println("<----------------after");
    }

    @Override
    public void say(String name) {
        before();
        hello.say(name);
        after();
    }
}

//测试;
public static void main(String[] args) {
    StaticProxy proxy=new StaticProxy();
    proxy.say("冯朗");
}

动态代理:JDK动态代理和CGLib动态代理

  • JDK动态代理:(JDK动态代理只能针对实现了接口的类生成代理);此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑.
/**
 * JDK动态代理;
 */
public class JDKProxy implements InvocationHandler{

    private Object object;

    public JDKProxy(Object object) {
        this.object=object;
    }

    public void before(){
        System.out.println("----------------->before");
    }

    public void after(){
        System.out.println("<----------------after");
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object result=method.invoke(object,args);
        after();
        return result;
    }


    @SuppressWarnings("unchecked")
    public <T> T getProxy(){
        /**
         * ClassLoader loader:类加载器;
         * Class<?>[] interfaces:获取目标类全部的接口;
         * InvocationHander:得到InvocationHandler接口的子类实例;
         */
        return (T) Proxy.newProxyInstance(
                object.getClass().getClassLoader(), 
                object.getClass().getInterfaces(), 
                this);
    }

}

//测试JDK动态代理
public static void main(String[] args) {
    Hello hello=new HelloImp();
    JDKProxy jdkProxy=new JDKProxy(hello);
    Hello proxy=jdkProxy.getProxy();
    proxy.say("冯朗");
}
  • CGLib动态代理(需要加入cglib包):CGLIB代理是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明称final的.
/**
 * CGLib动态代理;
 */
public class CGLibProxy implements MethodInterceptor {

    public void before(){
        System.out.println("----------------->before");
    }

    public void after(){
        System.out.println("<----------------after");
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        before();
        Object result=proxy.invokeSuper(obj, args);
        after();
        return result;
    }

    /**
     * 获取代理的实例;
     * @return
     */
    public Object createProxyInstance(Class<?> clazz){
        return Enhancer.create(clazz,this);
    }

}

//测试CGLib动态代理
public static void main(String[] args) {
    HelloImp hello=(HelloImp) new CGLibProxy().createProxyInstance(HelloImp.class);
    hello.say("冯朗");
}

//打印结果:
----------------->before
hello-->冯朗
<----------------after
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值