前言
在静态代理设计模式,被代理类作为代理类的属性,从而实现被代理类的前置增强与后置增强。动态代理是一种更好的解决方案。
基于接口的动态代理–jdk动态代理
public interface Animal {
void eat();
}
实现1
public class Cat implements Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
public class ProxyHanderler<T> implements InvocationHandler {
private T t;
public ProxyHanderler(T t) {
this.t = t;
}
public T getProxy(){
return (T) Proxy.newProxyInstance(this.getClass().getClassLoader(),t.getClass().getInterfaces(),this);
}
//处理代理实例--返回代理结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(t, args);
after();
return result;
}
private void before(){
System.out.println("喵咪吃鱼前洗手手");
}
private void after(){
System.out.println("喵咪吃鱼后洗手手");
}
}
实现2( 实现1前后增强的抽取)
public class Dog implements Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
public interface ProxyHanderlerFace extends InvocationHandler {
default void before(Callable func) throws Exception {
func.call();
}
default void after(Callable func) throws Exception {
func.call();
}
}
public class ProxyHanderler2<T> implements ProxyHanderlerFace{
private T t;
public ProxyHanderler2(T t) {
this.t = t;
}
public T getProxy(){
return (T) Proxy.newProxyInstance(this.getClass().getClassLoader(),t.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(t, args);
return result;
}
}
测试
public static void main(String[] args) throws Exception {
Animal cat=new Cat();
ProxyHanderler<Animal> handerler = new ProxyHanderler<>(cat);
Animal proxy = handerler.getProxy();
proxy.eat();
Animal dog=new Dog();
ProxyHanderler2<Animal> animalProxyHanderler2 = new ProxyHanderler2<>(dog);
animalProxyHanderler2.before(() -> {
System.out.println("狗子吃骨头-----前------洗爪爪");
return null;
});
Animal dogProxy = animalProxyHanderler2.getProxy();
dogProxy.eat();
animalProxyHanderler2.after(() -> {
System.out.println("狗子吃骨头-----后------洗爪爪");
return null;
});
}