目录结构
public interface UserDao {
public int add(int a,int b);
public String update(String id);
}
public class UserDaoImpl implements UserDao{
@Override
public int add(int a, int b) {
System.out.println("UserDaoImpl add方法执行了。。。。");
return a+b;
}
@Override
public String update(String id) {
System.out.println("UserDaoImpl update方法执行了.....");
return id;
}
}
public class JDKProxy {
public static void main(String[] args){
//创建接口实现类代理对象
Class<?>[] interfaces = {UserDao.class};
UserDao userDao = new UserDaoImpl();
//classLoader,类加载器
//interfaces,被代理的对象
//InvocationHandler,代理对象:去执行代理的方法
UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
String ni = dao.update("ni");
System.out.println("id为:" + ni);
int add = dao.add(1, 2);
System.out.println("结果为:" + add);
}
}
/**
* 创建代理对象代码
*/
class UserDaoProxy implements InvocationHandler {
/**
* 把创建的是谁的代理对象,把谁传递过来
* 有参构造传递
*/
private final Object obj;
public UserDaoProxy(Object obj) {
this.obj = obj;
}
/**
* 增强的逻辑
* @param proxy 代理对象自身
* @param method 正在执行的方法
* @param args 传递的参数
* @return res
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法之前
System.out.println("方法之前执行...." + method.getName() + ":传递的参数..." + Arrays.toString(args));
//被增强的方法执行
Object res = method.invoke(obj, args);
//方法之后
System.out.println("方法之后执行..." + obj);
return res;
}
}
工厂方式创建代理类适配器
public class JDKProxyFactory {
public static <T> T getProxy(Class<T> cacheClazz, Class<? extends ICacheAdapter> cacheAdapter) throws Exception {
InvocationHandler handler = new JDKInvocationHandler(cacheAdapter.newInstance());
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
return (T)Proxy.newProxyInstance(classLoader, new Class[]{cacheClazz}, handler);
}
}
public class JDKInvocationHandler implements InvocationHandler {
/**
* 把创建的是谁的代理对象,把谁传递过来
* 有参构造传递
*/
private final ICacheAdapter cacheAdapter;
public JDKInvocationHandler(ICacheAdapter cacheAdapter) {
this.cacheAdapter = cacheAdapter;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 获取和CacheService 同名的 方法
Method method1 = ICacheAdapter.class.getMethod(method.getName(), ClassLoaderUtils.getClazzByArgs(args));
Object res = method1.invoke(cacheAdapter, args);
System.out.println("方法执行后!....");
return res;
}
}
创建的是CacheService 的代理类,代理的方法是 CacheAdapter接口下的方法
@Test
public void test_CacheService() throws Exception {
CacheService proxy_EGM = JDKProxyFactory.getProxy(CacheService.class, EGMCacheAdapter.class);
proxy_EGM.set("user_name_01", "小傅哥");
String val01 = proxy_EGM.get("user_name_01");
logger.info("缓存服务 EGM 测试,proxy_EGM.get 测试结果:{}", val01);
CacheService proxy_IIR = JDKProxyFactory.getProxy(CacheService.class, IIRCacheAdapter.class);
proxy_IIR.set("user_name_01", "小傅哥");
String val02 = proxy_IIR.get("user_name_01");
logger.info("缓存服务 IIR 测试,proxy_IIR.get 测试结果:{}", val02);
}