jdk动态代理

jdk动态代理就是采用反射技术实现的

jdk动态代理前提条件是:被代理对象必须实现一个或者多个接口

jdk动态代理需要实现InvocationHandler接口和invoke()方法

例如:

接口userDao

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

接口实现类UserDaoImp
public class UserDaoImp implements userDao {
@Override
public void addUser() {
System.out.println("添加用户");
}

@Override
public void deleteUser() {
System.out.println("删除用户");

}
}
切面类Myaspect
//切面类,用于增强
public class Myaspect {
public void addBefore(){
System.out.println("添加之前的检查");
}
public void deleteBefore(){
System.out.println("删除之前的检查");
}

}

jdkProxy代理类
public class jdkProxy implements InvocationHandler {

//jdk动态代理的:要先建立代理对象和被代理对象的关系,然后实现代理逻辑
//动态代理必须实现一个或多个接口
private userDao userDao1;//目标对象也就是真实对象
    public Object creatProxy(userDao userDao1) {
this.userDao1 = userDao1;
return Proxy.newProxyInstance(jdkProxy.class.getClassLoader(), userDao1.getClass().getInterfaces(), this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强方法
Myaspect myaspect = new Myaspect();
myaspect.addBefore();
Object obj = method.invoke(userDao1, args);//实现调用目标方法
myaspect.deleteBefore();
return obj;
}
}
测试jdk代理
public class jdkProxyTest {
public static void main(String[] args) {
jdkProxy jdk = new jdkProxy();
// userDao userDao1 = new UserDaoImp();
userDao userDao2 = (userDao) jdk.creatProxy(new UserDaoImp());
userDao2.addUser();

}
}

结果:

添加之前的检查
添加用户
删除之前的检查

原文地址:https://www.cnblogs.com/jasonboren/p/10565328.html