导入jar包
/*
*
* 一个演员
*
*
*/
public class Actor implements IActor {
/*
* 基本的演出
*/
public void basicAct(float money){
System.out.println("拿到钱"+money+",开始基本演出");
}
public void dangeAtc(float money){
System.out.println("拿到钱"+money+",开始危险演出");
}
}
/*
* 模拟经纪公司对签约演员的标准
*
*/
public interface IActor {
/*
* 基本的演出
*/
public void basicAct(float money);
public void dangeAtc(float money);
}
/*
*
* 模拟一个剧组
*/
public class Client {
public static void main(String[] args) {
/*
* 动态代理:
* 作用:在不改变源码的基础上,对已有方法的增强(他是AOP思想的实现技术)
* 分类:
* 基于接口的动态代理:
* 要求:被代理类至少实现一个接口
* 提供者:JDK官方
* 涉及类:Proxy
* 创建代理对象的方法:Proxy.newProxyInstance(Classloader, Class[], InvocationHandler);
* Classloader:类加载器,
* Class[]:字节码数组,被代理类实现的接口.(要求代理对象和被代理对象有相同的方法)
* InvocationHandler:一个接口,用于提供增强代码.
* 策略模式:
*
*
*
*
*/
/*
* 找一个演员
*/
final Actor actor = new Actor();
IActor proxyActor = (IActor) Proxy.newProxyInstance(actor.getClass().getClassLoader(),actor.getClass().getInterfaces(),new InvocationHandler() {
/*
* 执行被代理对象的任何方法都会经过该方法
* 方法的参数:
* 代理对象的引用
* 当前执行的方法
* 当前执行的方法的参数
*
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object rtValue = null;
//取出方法的参数
float money = (float)args[0];
//判断当前执行的是什么方法
if("basicAct".equals(method.getName())){
//基本演出
if(money>10000){
//剧组抽查一半金额
money = money/2;
//执行方法:演出
rtValue = method.invoke(actor, money);
}
}
if("dangeAtc".equals(method.getName())){
//危险演出
if(money>50000){
//剧组抽查一半金额
money = money/2;
//执行方法:演出
rtValue = method.invoke(actor, money);
}
}
return rtValue;
}
});
proxyActor.basicAct(10005);
proxyActor.dangeAtc(70000);
}
}
/*
* 模拟经纪公司对签约演员的标准
*
*/
public class IActor {
/*
* 基本的演出
*/
public void basicAct(float money){
}
public void dangeAtc(float money){
}
}
/*
*
* 一个演员
*
*
*/
public class Actor extends IActor {
/*
* 基本的演出
*/
public void basicAct(float money){
System.out.println("拿到钱"+money+",开始基本演出");
}
public void dangeAtc(float money){
System.out.println("拿到钱"+money+",开始危险演出");
}
}
/*
*
* 模拟一个剧组
*/
public class Client {
public static void main(String[] args) {
/*
* 基于子类的动态代理
* 要求:被代理类不能是最终类,不能被final修饰
* 提供者:第三方CGLib
* 涉及类:Enhancer
* 创建代理对象的方法:create(Class,Callback)
* 参数的含义:
* Class:被代理对象的字节码.
* Callback:如何代理
*/
/*
* 找一个演员
*/
Actor actor = new Actor();
Actor cglibActor = (Actor) Enhancer.create(actor.getClass(), new MethodInterceptor() {
/*
* 与基于接口的动态代理的方法作用一模一样
* 参数:
* 前面三个参数与基于接口的动态代理的方法的参数一样
* MethodProxy:当前执行方法的代理对象
*
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
Object rtValue = null;
//取出方法的参数
float money = (float)args[0];
//判断当前执行的是什么方法
if("basicAct".equals(method.getName())){
//基本演出
if(money>10000){
//剧组抽查一半金额
money = money/2;
//执行方法:演出
rtValue = method.invoke(actor, money);
}
}
if("dangeAtc".equals(method.getName())){
//危险演出
if(money>50000){
//剧组抽查一半金额
money = money/2;
//执行方法:演出
rtValue = method.invoke(actor, money);
}
}
return rtValue;
}
});
cglibActor.basicAct(10005);
cglibActor.dangeAtc(70000);
}
}