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();    //再测试加强后的方法

}

}

你可能感兴趣的:(Spring03)