文章目录
前言
设计模式中有一种叫做代理模式。了解动态代理前先来看看代理模式是什么
一、代理模式
1. 代理模式是什么
简单说就是不直接访问目标对象,提供一个代理用于控制对象访问
2.举个例子
定义接口People
public interface Person {
void play();
}
实现类 男人
public class Man implements Person{
@Override
public void play() {
System.out.println("打游戏------------------");
}
}
代理类
public class ManProxy implements Person{
private Man man;
public ManProxy(Man man) {
this.man = man;
}
@Override
public void play() {
System.out.println("代理对象执行代理方法");
man.play();
System.out.println("代理方法执行完毕");
}
}
测试类
public class Test {
public static void main(String[] args) {
Man man = new Man();
//不直接调用man的play方法,通过代理类去调用
ManProxy manProxy = new ManProxy(man);
manProxy.play();
}
}
3.执行测试类可以看到如下结果
可以看到通过代理类我们也能执行被代理的方法,并且可以进行执行前后进行操作
二、动态代理
动态代理不需要额外编写代理类,可以通过代码动态生成。可以不修改原类进行一些增强。例如aop可以通过这种方式实现
1.实现方式,保留上面的Person接口和Man类
2.创建PersonPlayHandler类实现InvocationHandler接口
public class PersonPlayHandler implements InvocationHandler {
private Object target;
public PersonPlayHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理对象执行代理方法");
//执行被代理方法
Object invoke = method.invoke(target, args);
System.out.println("代理方法执行完毕");
return invoke;
}
}
编写测试类
public class Test {
/* public static void main(String[] args) {
Man man = new Man();
//不直接调用man的play方法,通过代理类去调用
ManProxy manProxy = new ManProxy(man);
manProxy.play();
}*/
public static void main(String[] args) {
Man man = new Man();
PersonPlayHandler personPlayHandler = new PersonPlayHandler(man);
Person instance = (Person) Proxy.newProxyInstance(man.getClass().getClassLoader(),
man.getClass().getInterfaces(),
personPlayHandler);
instance.play();
}
}
执行
可以看到代理方法成功执行