代理模式、静态代理、动态代理
代理模式不论在面试还是实际应用中,都是不可避免的存在,今天温习下静态代理、动态代理的写法。
这是我的第一篇文章希望大家能够指正不足,要是能够对您有一点点的帮助,给个鼓励。
1、 静态代理
- 先新创建一个接口
public interface Target {
void hello(String name);
}
- 实现接口
public class TargetImpl implements Target{
@Override
public void hello(String name) {
System.out.println("你好:"+name);
}
}
- 创建代理类,也是实现了Target接口
public class TargetProxy implements Target {
private Target target;
public TargetProxy(Target target) {
super();
this.target = target;
}
@Override
public void hello(String name) {
before();
target.hello(name);
after();
}
private void after() {
System.out.println("之前操作");
}
private void before() {
System.out.println("之后操作");
}
}
- 客户端调用
public class ClientMain {
public static void main(String[] args) {
Target target=new TargetImpl();
Target proxy=new TargetProxy(target);
proxy.hello("明心");
}
}
2、动态代理
动态代理有两种实现方式,一个是jdk为我们提供的需要实现InvocationHandler接口,并重写其中的invoke方法,另一个是CGlib,一般只有框架中才会使用到,比如我们熟知的Spring AOP,这里只要说一下用jkd实现的简单写法。
- 同样是先创建一个接口
public interface Target {
void hello(String name);
}
- 用一个类去实现这个接口
public class TargetImpl implements Target{
@Override
public void hello(String name) {
System.out.println("你好:"+name);
}
}
- 创建代理类,实现InvocationHandler接口
public class TargetHandler implements InvocationHandler{
private Object targe;
public Object getInstance(Object targe){
this.targe=targe;
Class<?> clazz=targe.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(this.targe, args);
after();
return result;
}
private void after() {
System.out.println("之前操作");
}
private void before() {
System.out.println("之后操作");
}
}
- 客户端的调用有所不同
public class ClientMain {
public static void main(String[] args) {
TargetHandler targetHandler=new TargetHandler();
Target target = (Target) targetHandler.getInstance(new TargetImpl());
target.hello("明心");
}
}