动态代理

动态代理

1、动态代理(dynamic proxy)

​ 在运行时候,在JVM中动态 针对某一个类或者接口,产生一个对象

​ 特点:在不改变原有的类或者方法的基础上实现对类或者方法的增强

2、实现方法

  • 方法一:java的jdk中提供了一个类 Proxy静态方法 newProxyInstance(参数1,参数2,参数3)
    • 参数1:类加载器:负责加载.class文件到jvm内存
  • 方式二:Cglib中提供了一个类 Enhancer(英文:增强),方法 setSupperClass(...)

3、为什么要使用动态代理

增强一个类,在基础阶段,只有一种手段 就是继承!继承来实现类增强是有缺陷的,会造成子类爆炸,而且对方法破坏!于是动态代理就产生了,在不改变原有的代码的基础上对代码进行增强。

开发步骤:

  1. 必须要先定义一个接口
  2. 基于接口定义一个实现类
  3. 基于Proxy产生代理对象

基于JDK实现动态代理

在JDK中,实现类必须要实现一个接口,才能完成动态代理

接口

package com.hmall.jdk;

public interface Cline {

    void den();
}

实现类

package com.hmall.jdk;

public class JdkCline implements Cline{
    @Override
    public void den() {
        System.out.println("在跳舞");
    }
}

动态代理类

package com.hmall.jdk;

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

public class JdkClineTest {
    public static void main(String[] args) {
        ClassLoader loader = Cline.class.getClassLoader();
        Class<?>[] interfaces = JdkCline.class.getInterfaces();
        InvocationHandler invocation = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("在唱歌");
                Object invoke = method.invoke(new JdkCline(), args);
                System.out.println("退出历史舞台");
                return invoke;
            }
        };
        Cline instance = (Cline) Proxy.newProxyInstance(loader, interfaces, invocation);
        instance.den();
    }
}

编译效果:

基于Cglib实现动态代理

实现类

package com.hmall.cglibProxy;

public class Cglib {
    public void den(){
        System.out.println("我在唱歌");
    }
}

动态代理类

package com.hmall.cglibProxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InvocationHandler;

import java.lang.reflect.Method;

public class CglibClient {

    public static void main(String[] args) {
        //创建Enhancer对象
        Enhancer enhancer = new Enhancer();
        //设置生成代理对象父类
        enhancer.setSuperclass(Cglib.class);
        //设置回调
        enhancer.setCallback(new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("鞠躬!!!!!!!!!!!");
                Object invoke = method.invoke(new Cglib(), args);
                System.out.println("挥手~~~~~~~~~~~~~~~~~~~~~~~~");
                return invoke;
            }
        });
        //创建代理对象
        Cglib o = (Cglib) enhancer.create();
        o.den();

    }
}

编译效果

posted @ 2024-12-19 20:25  听宏  阅读(42)  评论(0)    收藏  举报