1.创建需要被代理的对象的接口,并实现这个接口
package com.dl.code.dao;
/**
* Created with IntelliJ IDEA.
* 作者: 代蒙恩
* 日期: 2021/2/24
* 时间: 14:56
* 描述: JDK动态代理的练习
* 内容: 当前接口,是需要被代理对象的接口
*/
public interface UserDao {
public void add();
public String getUser(String name);
}
实现接口
package com.dl.code.dao.impl;
import com.dl.code.dao.UserDao;
/**
* Created with IntelliJ IDEA.
* 作者: 代蒙恩
* 日期: 2021/2/24
* 时间: 14:57
* 描述: JDK动态代理练习
* 内容: 接口的实现
*/
public class UserDaoImpl implements UserDao {
@Override
public void add() {
System.out.println("add.....");
}
@Override
public String getUser(String name) {
System.out.println("getUser....");
return name;
}
}
2.创建JDK代理类
package com.dl.code.JDKProxy;
import com.dl.code.dao.UserDao;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* Created with IntelliJ IDEA.
* 作者: 代蒙恩
* 日期: 2021/2/24
* 时间: 14:58
* 描述: JDK动态代理
* 内容: 动态代理类
* 创建方式 : 实现 InvocationHandler 接口
*/
public class JDKProxy implements InvocationHandler {
//定义需要被代理的对象
private UserDao userDao;
//提供一个构造器,用来创建JDKProxy对象
public JDKProxy(UserDao userDao) {
this.userDao = userDao;
}
//提供一个方法,用来创建代理对象
public UserDao creatProxy(){
/*
* 创建代理对象的原理:Java反射技术
* Proxy.newProxyInstance 需要三个参数:
* 第一个参数:类加载器
* 第二个参数:接口列表
* 第三个参数:实现了InvocationHandler的对象
*/
UserDao proxyInstance = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
userDao.getClass().getInterfaces(), this);
return proxyInstance;
}
/**
* 这里的 invoke 方法 在当前类的 任何一个方法被调用的时候,都会自动的执行。
* 解释: Proxy.newProxyInstance 第三个参数 this 就是调用这个方法的。
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//获取方法的名称
String name = method.getName();
//增强 add 方法
if("add".equals(name)){
//在这里编写,需要增强的代码
System.out.println("我是增强的代码....");
//执行原来的方法
Object result = method.invoke(userDao, args);
return result;
}
//如果当前方法不是 add 方法,则直接执行原先的方法即可
Object result = method.invoke(userDao, args);
return result;
}
}
3.测试代码
@Test
public void testJDKProxy(){
//创建代理类
JDKProxy jdkProxy = new JDKProxy(new UserDaoImpl());
//获得代理对象
UserDao userDao = jdkProxy.creatProxy();
//通过代理对象执行方法
// userDao.add(); //运行结果:add方法被增强
userDao.getUser("代先生"); //运行结果:getUser方法没有被增强
}