-
使用JDK动态代理,使用Proxy类中的方法创建代理对象
(1)调用newProxyInstance方法方法中有三个参数参数一:ClassLoader(类加载器)
参数二:增强方法所在类,类实现的接口,支持多个接口
参数三:实现这个接口InvocationHandler,创建代理对象,写增强的方法 -
JDK动态代理代码
package com.yang.run;
import com.yang.dao.UserDao;
import com.yang.dao.impl.UserImplDao;
import org.junit.Test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @program: TestSpring
* @description: 测试JDK动态代理
* @author: 陈阳
* @create: 2021-01-30 20:37
**/
public class TestProxy {
@Test
public void test1(){
Class [] inter = {UserDao.class};
/**
* 参数一:当前类
* 参数二:增强类的数组
* 参数三: 实现InvocationHandler的类
*/
// Proxy.newProxyInstance(TestProxy.class.getClassLoader(), inter, new InvocationHandler() {
// public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// return null;
// }
// });
UserDao uDao = (UserDao)Proxy.newProxyInstance(TestProxy.class.getClassLoader(), inter, new UserDaoProxy1(new UserImplDao()));
int add = uDao.add(1, 2);
System.out.println(add);
}
class UserDaoProxy1 implements InvocationHandler{
//把被代理对象传到代理类中
private Object obj;
//设置有参构造
public UserDaoProxy1(Object obj) {
this.obj=obj;
}
/**
* 增强方法
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("执行前代码");
//返回方法名
String name = method.getName();
//被增强方法执行
Object invoke = method.invoke(obj, args);
System.out.println("执行后代码");
return invoke;
}
}