0
点赞
收藏
分享

微信扫一扫

代理模式之动态代理的实现——jdk

动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。

动态代理最大的特点就是没有代理类
动态代理有两种实现方式,CGLib与jdk,这里用的是jdk实现动态代理
就静态代理举个栗子

故事背景

有两个人,有很多money的张三和24K纯屌丝李四,他们做着做同样的事情——惹上了官司和吃饭,张三就雇用专业的律师打官司,饭自己吃;李四雇不起律师,只好自己上,饭当然也是要自己吃……用动态代理实现如下

接口

package com.hk.service;
/**
* 定义一个接口(一类人要做的事情)
* @author 浪丶荡
*
*/
public interface ISomeService {
//打官司
public String Litigate();
//吃饭
public String eat();
}

目标类

package com.hk.service;
/**
* 目标类
* @author 浪丶荡
*
*/
public class ISomeServiceImp implements ISomeService {

@Override
public String Litigate() {
return "自己打官司,输了";
}

@Override
public String eat() {
return "自己吃饭";
}

}

测试方法

package com.hk.test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.hk.service.ISomeService;
import com.hk.service.ISomeServiceImp;
public class MyTest {
public static void main(String[] args) {
//有money人张三
final ISomeService zhangsan = new ISomeServiceImp();
//屌丝李四
ISomeService lisi = new ISomeServiceImp();

//张三请的律师打官司,饭自己吃
ISomeService sp = (ISomeService) Proxy.newProxyInstance(
zhangsan.getClass().getClassLoader(), //目标类的类加载器
zhangsan.getClass().getInterfaces(), //目标类所实现的所有接口
new InvocationHandler() { //匿名内部类
/**
* proxy 代理对象
* method 目标方法(代理的业务)
* args 目标方法的参数列表
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {

if(method.toString().contains("eat")){//吃饭就不用律师代劳了,自己来
return (String)method.invoke(zhangsan, args);//反射,调用张三的方法;
}
return "律师打官司,赢了";

}
});
System.out.println("zhangsan"+sp.Litigate()+"-----"+sp.eat());
//苦逼的李四自己打官司,自己吃饭
System.out.println("lisi"+lisi.Litigate()+"-----"+lisi.eat());
}
}

结果

zhangsan律师打官司,赢了-----自己吃饭
lisi自己打官司,输了-----自己吃饭


举报

相关推荐

0 条评论