动态代理代码实例

动态代理代码实例

package com.atguigu.java;

/*
 *
 *动态代理举例
 *
 *
 *@author 刘鑫
 *@create by 2021/4/16 20:26
 */

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

interface Human{
    String belief();
    void eat();
}

//被代理类
class SuperHuman implements Human{

    @Override
    public String belief() {
        return "I can fly!";

    }

    @Override
    public void eat() {
        System.out.println("我爱吃四川麻辣烫!");
    }
}

/*
要想实现动态代理,需要解决的问题?
问题一:如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象。
问题二:当通过代理类的对象待用方法时,如何动态的去调用被代理类中的同名方法。
 */
class ProxyFactory{

    public static Object getProxyInstance(Object obj){
        //创建调用处理程序
        MyInvocationHandler handler = new MyInvocationHandler();
        handler.bind(obj);
        //根据类加载器,代理类实现的接口,调用处理程序创建代理对象
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);
    }
}


//调用处理程序类,当代理类调用方法时,就会执行该类中的invoke()方法
class MyInvocationHandler implements InvocationHandler {

    private Object obj;
    public void bind(Object obj){
        this.obj=obj;
    }
    
    //Object proxy:代表该处理类
    //Method method:代表该处理类中的一个方法
    //Object[] args:代表该处理类中的一个方法的参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(obj,args);
    }
}
public class ProxyTest {

    public static void main(String[] args) {
        SuperHuman superHuman = new SuperHuman();
        Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superHuman);

        System.out.println(proxyInstance.belief());
        //当调用该方法时,就会调用调用处理程序里面的invoke()方法,将该方法eat传进method
        proxyInstance.eat();


    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值