jdk动态代理 和 cglib动态代理

//结果
enhancing
eat

jdk动态代理:jdk自带,被代理类实现接口,委托类(handler)实现InvocationHandler,方法增强可以写在invoke中。上代码

package com.mmh.springbootall.test;

/**
 * @Description: jdk动态代理--接口
 * @Author : myron
 * @Date : 2020-06-23 14:14
 **/
public interface Person {
    void hello();
}
package com.mmh.springbootall.test;

/**
 * @Description: jdk动态代理--被代理类
 * @Author : myron
package com.mmh.springbootall.test;

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

/**
 * @Description: jdk动态代理--委托类
 *
 * 用来做生成代理类的前置逻辑
 * 用来做方法增强:invoke方法
 *
 * @Author : myron
 * @Date : 2020-06-23 14:17
 **/
public class CustomJdkInvocationHandler implements InvocationHandler {
    private Object target;

    public void setTarget(Object target){
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //方法增强
        System.out.println("i'm invocation handler before");
        Object o = method.invoke(target, args);
        //方法增强
        System.out.println("i'm invocation handler after");
        return o ;
    }

    public Object createProxyObject(){
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                                      target.getClass().getInterfaces(),this);
    }
}
 
  
 

 * @Date : 2020-06-23 14:15
 **/
public class Man implements Person{

    @Override
    public void hello() {
        System.out.println("hello");
    }
}
package com.mmh.springbootall.test;

/**
 * @Description: jdk动态代理--测试类
 * @Author : myron
 * @Date : 2020-06-23 14:22
 **/
public class JdkDynamicProxyTest {
    public static void main(String[] args){
        Person p = new Man();
        //代理委托类
        CustomJdkInvocationHandler handler
                = new CustomJdkInvocationHandler();
        //设置被代理类
        handler.setTarget(p);
        //生成代理类
        Person proxyObject = (Person)handler.createProxyObject();
        proxyObject.hello();

    }
}
//结果
i'm invocation handler before
hello
i'm invocation handler after

                     

cglib动态代理 :jdk1.3替代产品

package com.mmh.springbootall.test;

import com.alibaba.fastjson.JSONObject;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @Description: Cglib动态代理--父类
 * @Author : myron
 * @Date : 2020-06-23 14:57
 **/
public class Animal {
    private void run() {
        System.out.println("run");
    }

    public void eat() {
        System.out.println("eat");
    }
}
package com.mmh.springbootall.test;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @Description: Cglib动态代理--拦截器(类似委托类)
 * <p>
 * 用来做生成代理类的前置逻辑
 * 用来做方法增强:intercept方法
 * Enhancer:生成代理类
 * 但因为采用的是继承,所以不能对final修饰的类进行代理
 * @Author : myron
 * @Date : 2020-06-23 15:38
 **/
public class CustomCglibMethodInterceptor implements MethodInterceptor {


    /**
     * 会生成 target 的 子类(代理类)
     * @param target 被代理类
     * @return
     */
    public Object createProxy(Object target) {
        Enhancer enhancer = new Enhancer();
        enhancer.setCallback(this);
        enhancer.setSuperclass(target.getClass());
        return enhancer.create();
    }


    @Override
    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy proxy) throws Throwable {
        //增强
        System.out.println("enhancing");
        return proxy.invokeSuper(arg0, arg2);
    }
}
package com.mmh.springbootall.test;

/**
 * @Description: Cglib动态代理--测试类
 * @Author : myron
 * @Date : 2020-06-23 18:18
 **/
public class CglibDynamicProxyTest {

    public static void main(String[] args) {
        Animal animal = new Animal();
        CustomCglibMethodInterceptor interceptor =
                new CustomCglibMethodInterceptor();
        Animal proxy = (Animal)interceptor.createProxy(animal);
        proxy.eat();
    }
}

猜你喜欢

转载自www.cnblogs.com/mmh760/p/13183778.html