newProxyInstance(ClassLoader loader, 类>[] interfaces, InvocationHandler h) //返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。
JDK动态代理(有接口情况)ClassLoader 类加载器 interfaces 增强方法所在类 类所实现的接口-------Class[] interfaces = {UserDao.class}; InvocationHandler 实现InvocationHandler 创建代理对象 写增强方法 是一个接口
创建接口,定义方法
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) {
return a + b;
}
@Override
public String update(String id) {
return id;
}
}
使用Proxy类创建代理对象
public class JDKProxy {
public static void main(String[] args) {
//创建接口实现类的代理对象
Class[] interfaces = {UserDao.class};
UserDaoImpl userDao = new UserDaoImpl();
UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
int add = dao.add(4, 8);
System.out.println(add);
}
//创建代理对象的代码
class UserDaoProxy implements InvocationHandler {
//1 我们创建的是UserDao的代理对象要把它传过来,也就是增强前的逻辑
//通过有参构造进行传递
private Object object;
public UserDaoProxy(Object object) {
this.object = object;
}
//是我们增强的逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法之前
System.out.println("方法之前执行"+method.getName() + Arrays.toString(args));
//增强方法
Object rst = method.invoke(object, args);
if (method.getName().equals("add")){
System.out.println("hhhh");
}
//方法之后
System.out.println("方法之后执行"+object);
return rst;
}
}
(1)连接点:类里面可以被增强的方法。
(2)切入点:实际被增强的方法。
(3)通知(增强):实际增加的逻辑部分。( 通知有多种类型)
前置通知
后置通知
环绕通知
异常通知
最终通知(finally)
(4)切面:把通知应用到切入点的过程。



