jdk动态代理与CGLib动态代理

发布于:2024-02-22 ⋅ 阅读:(83) ⋅ 点赞:(0)

jdk动态代理

目标对象

package com.study;

/**
 * 目标对象(被代理的对象)
 *
 */
public class Target implements TargetInf{
    public String name;


    public Target() {

    }
    public Target(String name) {
        this.name = name;
    }

    public String buyCola (String name){
        System.out.println("买了一瓶"+name+"可乐");
        return "给你可乐";
    }

    public void byMilk(){
        System.out.println("买牛奶");
    }
}

代理对象

package com.study;

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

public class JDKProxyUtil {

    public static  TargetInf getProxy(Target target){
        /*
        * ClassLoader loader,
          Class<?>[] interfaces,
          InvocationHandler h
         */
        TargetInf o = (TargetInf)Proxy.newProxyInstance(JDKProxyUtil.class.getClassLoader(),
                new Class[]{TargetInf.class},
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                        System.out.println("before...");

                        Object o1 = method.invoke(target, args);

                        System.out.println("after...");

                        return o1;
                    }
                });
        return o;
    }
}

测试方法

package com.study;

import java.lang.reflect.Proxy;

/**
 * jdk动态代理
 */
public class Test {


    public static void main(String[] args) {
        TargetInf target = (TargetInf) JDKProxyUtil.getProxy(new Target("Tom"));
        String 百事 = target.buyCola("百事");
        System.out.println(百事);

        target.byMilk();

    }


}

jdk动态代理增强的对象必须要实现接口

CGLib动态代理

目标对象可以不实现接口,也可以实现接口

代理对象

package com.study;

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

import java.lang.reflect.Method;

public class CGLibProxyUtil {

    public static  TargetInf getProxy(Target target){

        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(TargetInf.class);
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

                System.out.println("CGLIB Before...");

                 Object res = method.invoke(target, objects);

                System.out.println("CGLIB After...");

                return res;

            }
        });
        TargetInf o = (TargetInf) enhancer.create();
        return o;
    }
}

测试代码

package com.study;

import java.lang.reflect.Proxy;

/**
 * jdk动态代理
 */
public class Test {


    public static void main(String[] args) {

        Target target1 = new Target("Jerry");
        TargetInf proxy = CGLibProxyUtil.getProxy(target1);
        String kekou = proxy.buyCola("可口");
        System.out.println(kekou);

        proxy.byMilk();

    }


}

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到