简单的动态代理的实现

文章介绍了如何在Java中使用接口和动态代理实现对对象方法的增强。首先定义了一个PersonDo接口,接着创建了实现该接口的Student类。然后通过Proxy类和InvocationHandler接口创建了代理类ProxyUtil,代理类在调用实际方法前后可以添加额外操作。最后,测试类展示了如何使用代理调用唱歌和跳舞方法。
摘要由CSDN通过智能技术生成

1.接口定义

public interface PersonDo {
    public abstract  String sing(String name);
    public abstract void dance();
}

2.被代理对象的类

public class Student implements PersonDo{
    private String name;
    public  Student(){

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public String sing(String song){
        System.out.println(this.name+"歌名为"+song);
        return "致谢!";
    }
    public void dance(){
        System.out.println(this.name+"正在跳舞");
    }
}

3.创建代理类

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

/**
 * 在该类中来创建一个代理
 * */
public class ProxyUtil {
    /**
    * 形参:被代理的对象
    * 返回值:创建的代理
    * */
    public static PersonDo createProxy(Student student){
        /**
        * 参数1:用于指定哪个类加载器,去加载生成的代理类
        * 参数2:指定接口
         * 参数3:用于指定代理对象干什么事情。
        * */
        PersonDo personDo=(PersonDo) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),  /**参数1:用于指定哪个类加载器,去加载生成的代理类*/
                new Class[]{PersonDo.class},/**参数2:指定接口,注意:需要将接口的字节码放到数组中*/
                /**参数3:生成的代理应当干什莫事情,用于指定代理对象干什么事情。*/
                new InvocationHandler() {
                    /**
                     * 参数一:代理的对象
                     * 参数二:要运行的方法
                     * 参数三:调用sing方法,传递的实参
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //1.前置准备工作
                        if("sing".equals(method.getName())){
                            System.out.println("准备话筒和场地工作!");
                        } else if ("dance".equals(method.getName())) {
                            System.out.println("准备场地工作!");
                        }
                        /**2.调用唱歌或跳舞的方法*/

                        return  method.invoke(student,args);
                    }
                });
        return personDo;
    }
}

 简单来说,就是代理类应当和被代理类实现同一个接口,然后,红框里面的东西很重要,应当理解。

4.测试类

public class Test {
    public static void main(String[] args){
        /**
         * 1.获取代理的对象
         */
        Student student1=new Student("张三");
        PersonDo proxy=ProxyUtil.createProxy(student1);
        /**
         * 2.代理调用唱歌或跳舞的其他方法
         * */
        String result=proxy.sing("青花瓷");
        System.out.println(result);
    }
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值