- 在不改变代码的前提下 对某一逻辑、某一方法进行增强
动态代理示例 ```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;@Overridepublic 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);
}
```
