Spring03

proxy代理

当我们某个功能需要加强的时候我们可以通过proxy代理来加强

案例:

步骤1:在com.hello.dao包下新建一个CarDao接口以及他的实现类CarDaoImpl,具体代码如下:

CarDao接口:

package com.hello.dao;

public interface CarDao {

    public void play();

}

CarDaoImpl实现类:

package com.hello.dao;

public class CarDaoImpl implements CarDao {

        @Override

        public void play() {

                System.out.print("我能跑120km/h");

        }

}

我们现在有待加强的方法play(),等一下通过代理把它加强一下~

步骤2:新建一个com.hello.proxy包并在包下新建一个代理工具类ProxyUtils

package com.hello.proxy;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import com.hello.dao.CarDao;

public class ProxyUtils {

public static CarDao getPlayProxy(final CarDao cd){

// 直接 call 代理对象出来帮忙:Proxy

CarDao cdPlus=(CarDao) Proxy.newProxyInstance(cd.getClass().getClassLoader(), cd.getClass().getInterfaces(), new InvocationHandler() {

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

// 接着,找到需要加强方法,就再把需要加强的东西写进去

if("play".equals(method.getName())) {

System.out.print("我能飞上天");

}

return method.invoke(cd, args);

}

});

return cdPlus;     //把普通的一个对象传进来,返回一个加强后的对象

}

}

步骤3:然后就可以测试了,新建一个测试类TestClass

package com.hello.test;

import org.junit.Test;

import com.hello.dao.CarDao;

import com.hello.dao.CarDaoImpl;

import com.hello.proxy.ProxyUtils;

public class TestClass {

@Test

public void test(){

CarDao cd=new CarDaoImpl();    //new一个CarDaoImpl对象

System.out.print("我的初始技能:");

cd.play();        //先看看没有加强之前的内容

System.out.println();

System.out.print("我改装之后的技能:");

//把对象传进代理工具类加强,得到一个加强后的对象

CarDao udPlus = ProxyUtils.getPlayProxy(cd);    

udPlus.play();    //再测试加强后的方法

}

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 废话不多说,自己进入今天的主题 1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:...
    传奇内服号阅读 2,414评论 1 31
  • 每个民族都有自己独步于世界民族之林的特性和个性,埃塞俄比亚的传统民族食品“英吉拉”(injera)就具备这...
    雨人视界阅读 4,262评论 0 3
  • 愿我的不舍退场 换来你的独立成长 (一) 都说父母的退场才有儿女的成长 你可曾知道 真叫我从你生活中退场 那该是我...
    走失的半生阅读 392评论 0 1