目录结构:
目标对象接口:【UserService】
public interface UserService {
public void AddUser();
}
目标对象接口实现类:【UserServiceImpl】
public class UserServiceImpl implements UserService {
@Override
public void AddUser() {
System.out.println("添加用户成功");
}
}
动态代理实现:【ProxyFactory】
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
// 聚合目标对象
private UserService target;
// 代理对象构造方法
public ProxyFactory(UserService target) {
this.target = target;
}
// 该方法用于返回一个代理对象
public Object getProxyInstance(){
/** 方法源码:
* public static Object newProxyInstance(
* ClassLoader loader,
* Class<?>[] interfaces,
* InvocationHandler h)
**/
/** 参数说明:
* loader:指定当前目标对象使用的类加载器 获取加载器的方法固定
* interfaces:目标对象实现的接口类型,使用泛型的方式确认类型
* h:事件处理,执行目标对象方法时,回去出发事件处理器的方法【会把当前执行的目标对象方法作为参数传入】
**/
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JDK代理开始");
// 执行目标方法 【这里用到了java反射机制】
/**
* target: 目标对象
* args:方法参数
*/
Object result = method.invoke(target,args);
System.out.println("JDK代理结束");
return result;
}
});
}
}
测试类:
import org.junit.Test;
public class MyTest {
@Test
public void f(){
// 创建目标对象
UserService userService = new UserServiceImpl();
// 创建代理工厂对象【返回值为Object类型的代理对象】
ProxyFactory proxyFactory = new ProxyFactory(userService);
// 将代理对象强制类型转换为目标对象类型
UserService userServiceProxy = (UserService) proxyFactory.getProxyInstance();
// 执行代理对象方法
userServiceProxy.AddUser();
}
}
执行效果: