package com.zgq.dao.impl;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.zgq.dao.UserManager;
/**
*
* @Name: DynamicProxy.java
* @Description: 动态代理类
* @Author: 邹国庆
* @Create 2019年11月16日 上午9:18:49
*/
public class DynamicProxy implements InvocationHandler {
//目标对象
private Object obj;
//通过构造方法,传入目标对象;
public DynamicProxy(Object obj) {
super();
this.obj = obj;
}
//根据传入目标对象,返回一个代理对象;
public static Object newProxy(Object realobj){
Class<?> classType = realobj.getClass();
//第一个参数:指定产生代理对象的ClassLoader,需要将这个ClassLoader指定为和目标对象同一个ClassLoader
//第二个参数:代理对象要实现和目标对象一样的接口,所以只需要拿到目标对象实现的接口即可;
//第三个参数:是表明这些被拦截的方法执行时需要执行那个InvocationHandler的invoke方法
return Proxy.newProxyInstance(classType.getClass().getClassLoader(), classType.getClass().getInterfaces(), new DynamicProxy(realobj));
}
/**
* Method:是在运行期间,JDK动态获得的目标对象的Method
* args:动态获取的目标对象方法中的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
check();
//反射调用目标对象的方法,调用完毕之后可能有返回值,所以要接受返回值
method.invoke(obj, args);
return null;
}
//方面性的代码
private void check(){
System.out.println("登录前,进行安全检查");
}
}
测试方法:
public static void main(String[] args) {
//创建一个目标代理类
UserManagerImpl userManager = new UserManagerImpl();
//创建一个动态代理类,调用代理方法
UserManager userInter =(UserManager) DynamicProxy.newProxy(userManager);
//调用需要被代理的方法
userInter.addUser("admin", "123");
}