采用动态代理的方式对一个类进行增强

本文介绍了如何通过创建接口和实现类,然后利用动态代理技术对实现类进行功能增强,详细阐述了动态代理调用方法的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 创建一个接口
package com.itheima.proxy;
/*
 * 服务员的接口
 */
public interface Waiter {

    public void server();

    public String sayHello(String name);
}
  1. 创建一个类来实现这个接口
package com.itheima.proxy;
/*
 * 服务员的实现类
 */
public class Waitress implements Waiter {

    @Override
    public void server() {
        System.out.println("服务中......");
    }

    @Override
    public String sayHello(String name) {

        return "Hello" + name;
    }

}
  1. 采用动态代理的方式对这个类进行增强并且调用方法
package com.itheima.proxy;

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

import org.junit.Test;

public class ProxyDemo1 {

    @Test
    public void demo1(){
        Waiter waiter = new Waitress();
        //waiter.server();

        //使用动态地代理:Proxy, newProxyInstance
        /*
         * ClassLoader  :类加载器
         * class[]      :被增强的对象实现的所有接口
         * InvocationHandler  :处理类
         */
        //第一个参数
        ClassLoader classLoader = waiter.getClass().getClassLoader();
        //第二个参数
        Class[] interfaces =  waiter.getClass().getInterfaces();
        //第三个参数
        //相当于Waiter的实现类
        Waiter waiter2 = (Waiter)Proxy.newProxyInstance(classLoader, interfaces, new MyInvocationHandler(waiter) );
        //waiter2.server();
        //说明现在调用代理对象的任何方法的时候,InvocationHandler中的invoke方法执行
        //waiter2.sayHello("张三");
        String s = waiter2.sayHello("李四");
        System.out.println(s);
    }
}

class MyInvocationHandler implements InvocationHandler{
    private Waiter waiter;
    public MyInvocationHandler(Waiter waiter){
        this.waiter = waiter;
    }
    @Override
    /*
     * 方法的参数:
     * proxy   :产生的代理对象
     * method  :当前正在调用的目标类的方法
     * obj     :正在执行的方法中的参数
     * 
     */
    public Object invoke(Object proxy, Method method, Object[] params)
            throws Throwable {
        //System.out.println("InvocationHandler  invocake执行了.....");
        //waiter.server();
        //System.out.println(method.getName());
        //利用反射使特定的方法执行
        Object obj = method.invoke(waiter, params);
        return obj;
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值