动态代理

观察以下代码:

interface Subject{  //定义接口
    public String say(String name,int age);
}

class RealSubject implements Subject{  //接口实现类
    @Override
    public String say(String name, int age) {
        return "姓名:" + name + " ,年龄: " + age;
    }
}

class ProxySubject implements Subject{  //代理类

    private Subject sub = null;
    public ProxySubject(Subject sub){
        this.sub = sub;
    }

    @Override
    public String say(String name, int age) {
        return this.sub.say(name,age);  //代理类调用实现类的方法
    }
}

public class DynaDemo01 {
    public static void main(String[] args) {
        Subject subject = new ProxySubject(new RealSubject());
        String info = subject.say("张三", 20);
        System.out.println(info);
    }
}

程序运行结果:
在这里插入图片描述
以上代理为静态代理,因为一个代理类只能为一个接口服务,那么如果现在有多个接口的话,就会产生过多的代理类,此时可以使用动态代理。
在Java中要实现动态代理机制,需要以下几个接口 、类的支持:
java.lang.reflect.InvocationHandler;
java.lang.reflect.Method;
java.lang.reflect.Proxy;

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

interface Subject{  //定义接口
    public String say(String name, int age);
}

class RealSubject implements Subject{  //接口实现类
    @Override
    public String say(String name, int age) {
        return "姓名:" + name + " ,年龄: " + age;
    }
}

class MyInvocationHandle implements InvocationHandler{  //代理类,根据传入的实例动态调用方法

    private Object obj;
    public Object bind(Object obj){
        this.obj = obj;
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object invoke = method.invoke(this.obj, args);
        return invoke;
    }
}


public class DynaDemo02 {
    public static void main(String[] args) {
        Subject subject = (Subject) new MyInvocationHandle().bind(new RealSubject());
        String info = subject.say("李四", 22);
        System.out.println(info);
    }
}

程序运行结果:
在这里插入图片描述
此动态代理机制在开发中使用较少,在框架(如Spring)的底层代码中较常用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值