目录
JDK动态代理
JDK动态代理使用Proxy类里面的newProxyInstance方法创建代理对象。
| Modifier and Type | Method and Description |
|---|---|
| static Object | newProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h)返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。 |
方法里有三个参数:
第一个参数:类加载器。
第二个参数:增强方法所在类,这个类实现的接口,支持多个接口。
第三个参数:实现这个接口InvocationHandler创建代理的对象,在这个类里写增强的方法。
代码实现
(1)创建接口,定义方法。
(2)创建接口实现类,实现方法。
(3)使用Proxy类创建接口代理对象。
UserDao接口:
package com.Keafmd.spring5;
/**
* Keafmd
*
* @ClassName: UserDao
* @Description:
* @author: 牛哄哄的柯南
* @date: 2021-01-17 20:41
*/
public interface UserDao {
public int add(int a,int b);
public String updat(String id);
}
UserDaoImpl实现类:
package com.Keafmd.spring5;
/**
* Keafmd
*
* @ClassName: UserDaoImpl
* @Description: 实现类
* @author: 牛哄哄的柯南
* @date: 2021-01-17 20:42
*/
public class UserDaoImpl implements UserDao{
@Override
public int add(int a, int b) {
System.out.println("add执行中...");
return a+b;
}
@Override
public String updat(String id) {
System.out.println("updat执行中...");
return id;
}
}
JDKProxy类:
package com.Keafmd.spring5;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* Keafmd
*
* @ClassName: JDKProxy
* @Description:
* @author: 牛哄哄的柯南
* @date: 2021-01-17 20:44
*/
public class JDKProxy {
public static void main(String[] args) {
//创建接口实现类代理对象
Class[] interfaces = {UserDao.class};
/*Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});*/
UserDaoImpl userDao = new UserDaoImpl();
UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
System.out.println("-----------对add方法进行增强----------");
int result = dao.add(1, 2);
System.out.println("result:" + result);
System.out.println("------------不增强updat方法------------");
String res = dao.updat("Keafmd");
System.out.println("res:" + res);
}
}
//创建代理对象代码
class UserDaoProxy implements InvocationHandler {
//把创建的是谁的代理对象,把谁传递过来
//有参构造传递
private Object obj;
public UserDaoProxy(Object obj) {
this.obj = obj;
}
//增强的逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("add".equals(method.getName())) { //通过判断实现对不同方法的增强
//方法执行之前
System.out.println("方法之前执行..." + method.getName());
//被增强的方法执行
Object res = method.invoke(obj, args);
//方法执行之后
System.out.println("方法之后执行" + obj);
return res;
} else { //不增强
Object res = method.invoke(obj, args);
return res;
}
}
}
输出结果:
-----------对add方法进行增强----------
方法之前执行...add
add执行中...
方法之后执行com.Keafmd.spring5.UserDaoImpl@5e481248
result:3
------------不增强updat方法------------
updat执行中...
res:Keafmd
Process finished with exit code 0
以上就是JDK动态代理的代码实现,在Spring5里面已经把动态代理的代码已经做了封装。
看完如果对你有帮助,感谢点赞支持!
如果你是电脑端的话,看到右下角的 “一键三连” 了吗,没错点它[哈哈]
加油!
共同努力!
Keafmd