- JDk动态代理实践
1.1调用jdkjava.lang.reflect.Proxy 类的newProxyInstance()方法,该方法中需要传递三个参数:当前类的类加载器、所要代理的目标对象的接口、所要代理的目标对象
1.2具体代码实现
定义接口TestDao,里面添加test1和test2方法
package com.yf.cn.dao;
public interface TestDao {
public void test1();
public void test2();
}
TestDaoImpl:
package com.yf.cn.dao;
public class TestDaoImpl implements TestDao {
@Override
public void test1() {
System.out.println(“test111”);
}
@Override
public void test2() {
System.out.println("test222");
}
}
1.3查看JDK动态代理源码可知:第三个参数需要传递一个InvocationHandler对象,追踪源码可知InvocationHandler是一个接口,我们需要的是其实现类,所以我们新建一个CustomerInvocationHandler类实现InvocationHandler接口
CustomerInvocationHandler:
package com.yf.cn.util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class CustomerInvocationHandler implements InvocationHandler {
private Object target;
public CustomerInvocationHandler(Object object){
this.target = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//添加增强的逻辑
System.out.println("TestDao增强的逻辑");
return method.invoke(target,args);
}
}
1.4测试:
package com.yf.cn.test;
import com.yf.cn.dao.TestDao;
import com.yf.cn.dao.TestDaoImpl;
import com.yf.cn.util.CustomerInvocationHandler;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) throws Exception {
TestDao jdkProxy = (TestDao) Proxy.newProxyInstance(Test.class.getClassLoader(),
new Class[]{TestDao.class},new CustomerInvocationHandler(new TestDaoImpl()));
jdkProxy.test1();
jdkProxy.test2();
}
}
执行如上测试方法,查看控制台输出日志发现已经实现的目标方法的动态代理
3. 模拟JDK动态代理(手写代码)