动态代理
1、创建接口
public interface UserDao {
public int add(int a, int b);
public String update(String s);
}
2、创建实现类
@Controller(value = "userDaoImpl")
public class UserDaoImpl implements UserDao {
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public String update(String s) {
return s;
}
}
3、使用 Proxy 类创建接口代理对象
package com.at.proxy;
import com.at.dao.ProxysDao;
import com.at.dao.ProxysDao;
import com.at.dao.UserDao;
import com.at.dao.UserDaoImpl;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
/**
* @author tao
* @version 1.0
* @date 2020-06-29 22:03
* @description 动态代理:创建代理某一个类的对象
*
* 1、调用 newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) 方法实现动态代理
* 方法有三个参数:
* 第一参数,当前类的加载器
* 第二参数,增强方法所在的类,这个类实现的接口,支持多个接口
* 第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分
*
* 2、传入InvocationHandler类型的参数,需要实现这个接口
* 实现类需要实现invoke方法:此方法中可以写入方法增强的功能
* 一旦这个接口的实现类对象创建就会调用invoke方法:返回被代理类的实例
*
* invoke(Object proxy, Method method, Object[] args)
* 第一参数:代理类的对象
* 第二参数:被代理类的方法
* 第三参数:增强方法的参数
*/
public class JDKProxy {
public static void main(String[] args) {
//使用动态代理调用Proxy的静态方法newProxyInstance
Class[] interfaces = {UserDao.class};
UserDaoImpl userDao = new UserDaoImpl();
//调用newProxyInstance
UserDao user = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new ProxysDao(userDao));
int add = user.add(1, 2);
System.out.println(add);
}
}
//创建代理类
class UserDaoImplProxy implements InvocationHandler {
//创建的是谁的代理对象,就把谁传递过来
//Object类型让其更加通用
private Object obj;
public UserDaoImplProxy(Object obj) {
this.obj = obj;
}
@Override
//当代理类的实例被创建时自动调用此方法:增强方法的逻辑在此方法中写入
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强方法前
System.out.println("增强方法前:" + method.getName() + " ,增强的方法参数:" + Arrays.toString(args));
//执行被增强方法:传入被代理类的对象引用和需要增强方法的参数
Object invoke = method.invoke(obj, args);//执行增强方法
//增强方法后
System.out.println("增强方法后:" + obj.getClass());
return invoke;
}
}