动态代理详解

代理设计模式

java设计模式的一种

静态代理

代理类在程序运行时创建的代理方式被成为 动态代理。 也就是说,这种情况下,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类的函数。

动态代理

相较于静态代理而言代理对象不在由自己编写而是让程序动态为我们创建一个代理对象。(主要用于对方法的增强)

下面是一个动态代理的例子
例子之前大家先阅读此段说明:一个演员要有剧组签他去演戏需要有经纪人,那么演员就是被代理对象即目标类,经纪人为代理对象,要找演员必须经过经纪人。
实现代码如下

1.定义接口
在使用动态代理时,我们需要定义一个位于代理类与委托类之间的中介类,这个中介类被要求实现Proxys接口,这个接口的定义如下:

//接口:相当于剧组
// 提供了演员和经纪人,一个被代理对象,一个代理对象
public interface Proxys {
void playNormal(int money) ;
void playDanger(int money);
}

2.设置被代理对象(即委托类的定义),委托类一定要实现接口

package 动态代理;
/**

  • 演员:被代理类

*/
public class Actor implements Proxys{

@Override
/**
* 演员拿多少钱进行普通的表演
*/
public void playNormal(int money) {
System.out.println(“演员进行普通的表演,可以拿到”+money);
}

@Override
/**
* 演员拿多少钱进行危险的表演
*/
public void playDanger(int money) {
System.out.println(“演员进行危险的表演,可以拿到”+money);
}
}

3.动态创建一个代理对象

package com.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.junit.Test;

public class ProxyText {
@Test
public void text() {
//要代理TargetText类,创建一个代理对象,这个代理对象要和被代理对象用一个类加载器,所以通过类加载器来获取(创建)这个代理对象
//此种是基于接口的动态代理
//创建动态代理的方法:用接口创建,(返回值为接口对象,即代理类和被代理类一起实现的接口)用下面方法创建一个代理对象
// Proxy.newProxyInstance(loader, interfaces, h)
//loader:因为代理对象和被代理对象(目标类)要使用相同的类加载器,所以通过被代理对象的类加载器来获取
//interfaces:被代理类实现的接口,要求代理类和被代理类要实现相同处的接口(有相同的行为),所以通过被代理类的接口获取
//InvocationHandler:h 用于提供增强代码的方法(如何代理)
Proxys newProxyInstance = (Proxys) Proxy.newProxyInstance(TargetText.class.getClassLoader(),
TargetText.class.getInterfaces(),
new InvocationHandler() {
@Override
//执行被代理对象的方法,用于增强
//proxy:代理对象的引用(一般不用)
//method:当前代理对象要对被代理类的哪一个方法进项增强
//args:被代理中方法的参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//要找对哪一个方法进行增强
return null;
}
});
// Proxys newProxyInstance = (Proxys) Proxy.newProxyInstance(TargetText.class.getClassLoader(),//获取目标对象的类加载器
// TargetText.class.getInterfaces(), //接口的字节码数组
// new InvocationHandler() {
// @Override
// //invoke为执行代理对象的方法
// public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// System.out.println(“执行前”);
// Object invoke = method.invoke(new TargetText(), args);
// System.out.println(“执行后”);
// return invoke;
// }
// }
// );
newProxyInstance.meyhod();
String m2 = newProxyInstance.m2();
System.out.println(m2);
int met = newProxyInstance.met(3);
System.out.println(met);
}
}

注意动态创建一个代理对象用到的方法是newProxyInstance,下面是对这个方法的说明

在这里插入图片描述
谢谢大家.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值