基于JDK

前提:被代理类必须有接口实现
目的:在不修改源码的前提下,对功能增强

步骤

检查条件,被代理对象是否有接口

获取(getClassLoader)类加载器和(getInterfaces)接口

        FangDong fangdong=new FangDong();
        ClassLoader classLoader=FangDong.class.getClassLoader();
        Class<?> [] interfaces=FangDong.class.getInterfaces();

使用反射的工具包,获取被代理接口的实例化类对象

Proxy.newProxyInstance(classLoader,interfaces,new InvocationHandler(){})

具体强化代码

       IChuZu chuZuproxy=(IChuZu) Proxy.newProxyInstance(classLoader,interfaces,new InvocationHandler(){
            public Object invoke(Object proxy, Method method,Object[] args) throws Throwable{
                System.out.println(Arrays.toString(args));
                Fangzi fangzip=(Fangzi) args[0];
                fangzip.setPrice(fangzip.getPrice()*8);
                System.out.println(Arrays.toString(args));
                Object result=method.invoke(fangdong,args);

                return result;
            }
        });
InvocationHandler 是 Java 动态代理机制的核心接口,它的作用可以简单理解为:“拦截代理对象的方法调用,并在调用前后插入自定义逻辑”。
invoke(Object proxy, Method method,Object[] args),method参数是代理方法名称,args是入参
Object result=method.invoke(fangdong,args);主动调用fangdong对象的原始方法

最后使用chuZuproxy.chuzu(fangzi);调用代理对象的方法
完整代码


public class T2 {
    public static void main(String[] args) {

        Fangzi fangzi=new Fangzi();
        fangzi.setName("石家庄");
        fangzi.setAdress("河北");
        fangzi.setPrice(12000);

        FangDong fangdong=new FangDong();
        ClassLoader classLoader=FangDong.class.getClassLoader();
        Class<?> [] interfaces=FangDong.class.getInterfaces();

       IChuZu chuZuproxy=(IChuZu) Proxy.newProxyInstance(classLoader,interfaces,new InvocationHandler(){
           public Object invoke(Object proxy, Method method,Object[] args) throws Throwable{
                Fangzi fangzip=(Fangzi) args[0];
                fangzip.setPrice(fangzip.getPrice()*8);
                Object result=method.invoke(fangdong,args);
                return result;
            }
        }
        );
        chuZuproxy.chuzu(fangzi);
    }
}

基于CGlib

与JDK实现的区别就是不用有接口实现也能代理

步骤

导入依赖

        <dependency>
            <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
            <version>3.3.0</version>
        </dependency>

完整代码


public class T3 {

    public static void main(String[] args) {

        Fangzi fangzi=new Fangzi();
        fangzi.setName("石家庄");
        fangzi.setAdress("河北");
        fangzi.setPrice(12000);

        FangDong fangDong=new FangDong();

        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(FangDong.class);

        enhancer.setCallback(new InvocationHandler(){
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("InvocationHandler invoke---");
                Fangzi fangzi1=(Fangzi) args[0];
                fangzi1.setPrice(fangzi1.getPrice()*2);
               Object result= method.invoke(fangDong,args);
                return result;
            }
        });

        IChuZu chuZuProxy=(IChuZu) enhancer.create();
        chuZuProxy.chuzu(fangzi);

    }

}

实例化Enhancer()

        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(FangDong.class);

设置回调enhancer.setCallback(new InvocationHandler(){},具体增强代码里面实现

        enhancer.setCallback(new InvocationHandler(){
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("InvocationHandler invoke---");
                Fangzi fangzi1=(Fangzi) args[0];
                fangzi1.setPrice(fangzi1.getPrice()*2);
               Object result= method.invoke(fangDong,args);
                return result;
            }
        });
Object result= method.invoke(fangDong, fangzi1);需要主动调用一次原代码,使用fangDong对象

最后创建代理并且调用方法

 IChuZu chuZuProxy=(IChuZu) enhancer.create();
        chuZuProxy.chuzu(fangzi);

2025-09-14T04:41:18.png