- 在不改变代码的前提下 对某一逻辑、某一方法进行增强
动态代理示例 ```java /**
- @author:LYY
- @Date:2022/5/13
动态代理案例 */ public class ProxyTest {
public static void main(String[] args) { Man man = new Man(); User factory = (User)ProxyObject.getFactory(man); factory.eat(“菠萝汁”); String interest = factory.interest(“打篮球”); System.out.println(interest); factory.show(); } }
/**
被代理类 */ class Man implements User {
/**
信息 */ @Override public void show() { System.out.println(“我是一个男人”); }
/**
- 喜欢吃的食物 *
@param tt */ @Override public void eat(String tt) { System.out.println(“我喜欢吃” + tt); }
/**
- 返回兴趣 *
- @param inter
- @return */ @Override public String interest(String inter) { return “兴趣:” + inter; } }
/**
动态代理 / class ProxyObject { /*
- 无法确定被代理对象的类型 只能返回Object
获得被代理对象 */ public static Object getFactory(Object o){ // 当在代理实例上调用方法时,方法调用指向被代理实例的方法 MyInvocationHandler myInvocationHandler = new MyInvocationHandler(); // 绑定被代理对象 myInvocationHandler.bind(o);
// jdk提供的动态代理创建方法并返回 return Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), myInvocationHandler); }
}
// 动态代理需要实现的接口
class MyInvocationHandler implements InvocationHandler{ /**
* 被代理对象
*/
private Object obj;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 被代理方法执行前可以进行方法增强
// 被代理对象方法执行
Object invoke = method.invoke(obj, args);
// 被代理方法执行后可以进行方法增强
return invoke;
}
/**
* 绑定被代理对象
* @param o
*/
void bind(Object o) {
this.obj = o;
}
}
/**
- @author LYY */ interface User {
/**
* 信息
*/
void show();
/**
* 喜欢吃的食物
* @param tt
*/
void eat(String tt);
/**
* 返回兴趣
* @param inter
* @return
*/
String interest(String inter);
}
```