参考博客:https://www.cnblogs.com/ygj0930/p/6542259.html
//jdk动态代理
/*JDK动态代理的代理对象在创建时,需要使用业务实现类所实现的接口作为参数
(因为在后面代理方法时需要根据接口内的方法名进行调用)。如果业务实现类是
没有实现接口而是直接定义业务方
法的话,就无法使用JDK动态代理了。并且,如果业务实现
类中新增了接口中没有的方法,这些方法是无法被代理的(因为无法被调用)*/
public class LearnInvocationHandler implements InvocationHandler{
private Object target;
public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this); }
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
Object result =method.invoke(proxy, args);
return result;
}
}
//cglib代理
public class LearnMethodInterceptor implements MethodInterceptor{
private Object target;//业务类对象,供代理方法中进行真正的业务方法调用
//相当于JDK动态代理中的绑定
public Object getInstance(Object target) {
this.target = target; //给业务对象赋值
Enhancer enhancer = new Enhancer(); //创建加强器,用来创建动态代理类
enhancer.setSuperclass(this.target.getClass()); //为加强器指定要代理的业务类(即:为下面生成的代理类指定父类)
//设置回调:对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实现intercept()方法进行拦
enhancer.setCallback(this);
// 创建动态代理类对象并返回
return enhancer.create(); //创建了target对应类的子类
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("预处理——————");
proxy.invokeSuper(obj, args); //调用业务类(父类中)的方法
System.out.println("调用后操作——————");
return null;
}
public static void main(String[] args) {
LearnMethodInterceptor lmInterceptor = new LearnMethodInterceptor();
Person person = new Person();
Person personProxy = (Person) lmInterceptor.getInstance(person);
personProxy.getPersonName("asdfsfd22");
}
}