- 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动态代理(手写代码)
本文介绍了如何使用JDK动态代理创建动态代理对象。通过实现InvocationHandler接口并利用Proxy类的newProxyInstance()方法,可以为指定接口生成代理实例。文章还提供了一个具体的例子,展示了从接口定义到代理对象创建及使用的全过程。

7083

被折叠的 条评论
为什么被折叠?



