1:动态代理概念
相比于静态代理,动态代理在创建代理对象上更加的灵活 ,通过反射机制在程序运行期,动态的为目标对象创建代理对象,代理的行为可以代理多个方法,即满足生产需要的同时又达到代码通用的目的
概念什么的放一边去吧,下面上代码
2:动态代理特点
JDK动态代理的目标对象必须有接口实现
2.1. 目标对象不固定
2.2. 在应用程序执行时动态创建目标对象
2.3. 代理对象会增强目标对象的行为
3:代码实现
3.1:编写接口,定义目标对象的父类接口
/*** 定义行为 */
public interface Marry {
public void toMarry();
}
3.2:定义目标对象类,实现接口
/*** 代理 ——> 目标对象 */
public class You implements Marry{
@Override
public void toMarry() {
System.out.println("我要结婚了");
}
}
3.3:定义代理类,实现接口
Proxy类是专门完成代理的操作类
public class JDKHandler implements InvocationHandler {
// 目标对象
private Object target;
// 目标对象的类型不固定,创建时动态生成 // 通过构造器将目标对象赋值
public JDKHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 增强行为
System.out.println("==============方法前执行");
// 调用目标对象的方法(返回Object)
Object result = method.invoke(target,args);
// 增强行为
System.out.println("方法后执行==============");
return result;
}
// 调用此方法获取代理
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
}
3.4:代码测试
public class Test {
public static void main(String[] args) {
// 目标对象
You you = new You();
// 获取代理对象
JDKHandler jdkHandler = new JDKHandler(you);
Marry marry = (Marry) jdkHandler.getProxy();
// 通过代理对象调用目标对象中的方法
marry.toMarry();
}
}