JDK动态代理的使用(Java)
JDK动态代理是Spring框架中一个重要的知识点,也是一种最常用的动态代理。JDK动态代理是java.lang.reflect.*包提供的方式,必须借助一个接口才能产生代理对象。所以可以先定义接口,再创建一个实现类来实现接口,最后就可以进行动态代理的实现了。
第一步先定义接口:
package com.soft.service;
public interface User {
public void save();
public void update();
public void delete();
public void find();
}
第二步提供一个实现类来实现接口:
package com.soft.service;
public class UserImpl implements User {
public void save() {
System.out.println("保存!");
}
public void update() {
System.out.println("更新!");
}
public void delete() {
System.out.println("删除!");
}
public void find() {
System.out.println("查找!");
}
}
完成以上后便可以开始进行动态代理了。
动态代理的实现:
package com.soft.service;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest1 {
public static void main(String[] args) {
//真实对象--既目标对象
final UserImpl target = new UserImpl();
//动态创建代理对象
/*
* 把生成的动态代理对象挂在接口下
* 显然UserImpl对象的接口是User
*/
User proxy = (User) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
//代理对象调用接口相应方法 都是调用invoke
/*
* proxy:是代理对象
* method:代表的是目标方法的字节码对象
* args:代表是调用目标方法时参数
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调度前");
//反射知识点
Object invoke = method.invoke(target, args);//目标对象的相应方法
System.out.println("调度后");
return invoke;
}
}
);
proxy.save();//调用invoke---Method:目标对象的save方法 args:null 返回值null
proxy.find();//调用invoke---Method:目标对象的find方法 args:null 返回值null
}
}
运行结果如下: