JDK动态代理

JDK动态代理是通过java.lang. reflect.Proxy类来实现的,我们可以调用Proxy类的newProxyInstance0方法来创建代理对象。对于使用业务接口的类,Spring默认会 使用JDK动态代理来实现AOP.

代码实现如下:

UserDao.java文件

package com.itheima.jdk;

public interface UserDao {
public void addUser();
public void deleteUser();
}


UserDaoImpl.java文件

package com.itheima.jdk;

//目标类
public class UserDaoImpl implements UserDao {

@Override
public void addUser() {
// TODO Auto-generated method stub
System.out.println("添加用户");
}

@Override
public void deleteUser() {
// TODO Auto-generated method stub
System.out.println("删除用户");

}

}


MyAspect.java文件

package com.itheima.aspect;
//切面类,可以存在多个通知Advice
public class MyAspect {

public void check_Permissions(){
System.out.println("模拟检查权限....");
}

public void log() {
// TODO Auto-generated method stub
System.out.println("模拟记录日志....");
}
}


JdkProxy.java文件

package com.itheima.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.itheima.aspect.MyAspect;
//JDK代理类
public class JdkProxy implements InvocationHandler {

//声明目标类接口
private UserDao userDao;

//创建代理方法
public Object creatProxy(UserDao userDao){
this.userDao = userDao;
//1.类加载器
ClassLoader classLoader = JdkProxy.class.getClassLoader();
//被代理对象实现的所有接口
Class<?>[] clazz = userDao.getClass().getInterfaces();
//使用代理类,进行增强,返回被代理类的对象
return Proxy.newProxyInstance(classLoader, clazz, this);
}

//所有动态代理类的方法调用,都会交由invoke()方法去处理
//proxy被代理后的对象
//method将要被执行的方法信息(反射)
//args执行方法需要的参数

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//声明切面
MyAspect myAspect = new MyAspect();
//前增强
myAspect.check_Permissions();

//在目标类上调用方法,并传入参数
Object obj = method.invoke(userDao, args);

//后增强
myAspect.log();

return obj;
}

}


JdkTest.java文件

package com.itheima.jdk;

public class JdkTest {

public static void main(String[] args) {
// TODO Auto-generated method stub
//创建代理对象
JdkProxy jdkProxy = new JdkProxy();
//创建目标对象
UserDao userDao = new UserDaoImpl();
//从代理对象中获取被增强后的目标对象
UserDao userDao1 = (UserDao) jdkProxy.creatProxy(userDao);

//执行方法
userDao1.addUser();
userDao1.deleteUser();
}

}


 

上一篇:报错:Invalid bound statement (not found)


下一篇:代码获取视频号助手登录Set-Cookie,从而获取个人用户信息等等。