1.静态代理
(1)公共接口
package com.ming.proxy;
public interface Kill {
String kill();
void say();
}
(2)委托类
package com.ming.proxy;
public class Mine implements Kill {
@Override
public String kill() {
System.out.println("我想要杀一个人。。。");
return "mine";
}
@Override
public void say() {
System.out.println("我是mine");
}
}
(3)静态代理类
(代理类持有委托类对象,并实现了相同的接口,从而控制委托类的方法)
package com.ming.proxy;
/**
*
* @ClassName: Killer
* @Description: TODO(代理类:杀手)
* @author chenliming
* @date 2017年6月27日 上午10:20:13
*
*/
public class Killer implements Kill {
private Mine mine;
public Killer(Mine mine) {
super();
this.mine = mine;
}
@Override
public String kill() {
System.out.println("刺杀前准备");
mine.kill();
System.out.println("刺杀后处理");
return "killer";
}
@Override
public void say() {
System.out.println("我是杀手");
}
}
(4)执行代码
package com.ming.proxy;
import org.junit.Test;
public class TestProxy {
@Test
public void testStaticProxy() {
Mine mine = new Mine();
Killer killer = new Killer(mine);
killer.kill();
}
}
2.jdk动态代理
(1)生成动态代理的类
package com.ming.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler {
private Object obj = null;
public Object bind(Object obj) {
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
@Override
/**
* 动态代理对象执行的方法,可以随意增强或者改变方法的执行
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("kill".equals(method.getName())) {
System.out.println("=====before=====");
Object temp = method.invoke(this.obj, args);
System.out.println("=====after======");
return "动态代理的改变返回值";
} else {
return null;
}
}
}
(2)执行代码
package com.ming.proxy;
import org.junit.Test;
public class TestProxy {
@Test
public void testStaticProxy() {
Mine mine = new Mine();
Killer killer = new Killer(mine);
killer.kill();
}
@Test
public void testDyProxy() throws Exception {
MyInvocationHandler demo = new MyInvocationHandler();
Kill subject = (Kill) demo.bind(new Mine());
String temp = subject.kill();
System.out.println(temp);
subject.say();
}
}