jdk动态代理和cglib代理

参考博客: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");     
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值