您的位置:首页 > 编程语言 > Java开发

java的代理模式(静态和动态代理)

2017-06-27 10:48 447 查看
1.静态代理

(1)公共接口

package com.ming.proxy;
/*
* 公共接口
*/
public interface Kill {
String kill();
void say();
}


(2)委托类

package com.ming.proxy;
/*
* 委托类:我想要杀一个人但是不想亲自动手,委托给别人来做,雇佣杀手,Killer类
*/
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;
/*
* 静态代理:
* 1.委托类和代理类实现相同的接口;
* 2.代理类持有委托类的对象
*/
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;
//生成代理对象参数(类加载器,类的所有接口,InvocationHandler对象)
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;
/*
* 静态代理:
* 1.委托类和代理类实现相同的接口;
* 2.代理类持有委托类的对象
*/
public class TestProxy {
@Test
/*
* 测试静态代理模式
*/
public void testStaticProxy() {
//委托类
Mine mine = new Mine();
//代理类
Killer killer = new Killer(mine);
killer.kill();
}
@Test
/*
* 测试java动态代理模式
*/
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();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: