最新公告:

中华视窗是诚信为本,市场在变,我们的诚信永远不变...

中华视窗

咨询热线

400-123-4657

公司动态

当前位置: 首页 > 新闻动态 > 公司动态

Java动态代理的设计与实现

添加时间:2024-02-11

/

简述Java代理模式的设计与实现1.设计:

代理对象存在的价值主要用于拦截对真实业务对象的访问,建立代理类是为了增强、扩展被代理类(即目标对象)的功能,实际上业务还是调用目标对象的方法。

2.实现:

第一步:先写一个接口,接口中封装了客户端(目标对象)需要的执行的操作

第二步:代理和客户端同时实现该接口,其中客户端中真正实现了接口中的方法,是一个真正的实体类,而代理只是保存了一个客户端的引用,使得其能访问该实体,代理在实现的接口中通过反射调用实体中的方法

其实代理模式有点像明星与经纪人的关系,明星不用操心接通告接代言的事,这些都交由经纪人打理,但最后演戏拍广告都由明星出演。这个例子中明星就相当于目标对象,经纪人就是代理对象。动态代理技术

动态代理公司_动态代理流程_代理动态公司名称

动态代理是一种较为高级的代理模式,动态代理技术主要有JDK,CGLIB, ,ASM。其中JDK主要针对接口代理,它的典型应用就是 AOP。CGLIB针对类进行代理。

静态代理实例

//这里创建了一个接口
public interface Study {
    void math(String math);
    void english(String english);
}
//下面是接口实现类
public class StudyImpl implements Study{
    @Override
    public void math(String math) {
        System.out.println("考试科目为:"+math);
    }
    @Override
    public void english(String english) {
        System.out.println("您正在进行"+english);
    }
}
//这是一个静态代理类
public class staticProxy implements Study{
    Study stu;
    public staticProxy(Study target) {
        this.stu=target;
    }
    public static void main(String[] args) {
        Study st=new StudyImpl();
        staticProxy s=new staticProxy(st);
        s.math("数学");
        s.english("英语");
    }
    @Override
    public void math(String math) {
        System.out.println("考试开始,请在答题纸上做答");
        stu.math("数学");
        System.out.println("考试结束,请放下笔等待收卷");
    }
    @Override
    public void english(String english) {
        System.out.println("考试开始,请在答题纸上做答");
        stu.english("英语");
        System.out.println("考试结束,请放下笔等待收卷");
    }
}
ouput
考试开始请在答题纸上做答
考试科目为数学
考试结束请放下笔等待收卷
考试开始请在答题纸上做答
考试科目为英语
考试结束请放下笔等待收卷

通过实例我们可以看出在静态代理类中实现了增强的方法,而且调用的是实现类的方法

动态代理实例以下实例为jdk动态代理

//这里动态代理实现的接口和代理类与静态代理相同,创建了一个ProxyHandler类来增强方法
public class ProxyHandler implements InvocationHandler {
    private Object target;
    public ProxyHandler(Object target){
        this.target=target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("考试开始,请在答题纸上做答");
        Object obj= method.invoke(target,args);
        System.out.println("考试结束,请放下笔等待收卷");
        return obj;
    }
//动态代理类
public class proxyTest{
    public static void main(String[] args) {
        Study s=new StudyImpl();
        ProxyHandler p=new ProxyHandler(s);
        Study proxy= (Study) Proxy.newProxyInstance(s.getClass().getClassLoader(),s.getClass().getInterfaces(),p);
        proxy.math("数学");
        System.out.println("代理对象proxy的类型"+proxy.getClass());
        System.out.println("代理对象proxy的父类"+proxy.getClass().getGenericSuperclass());
    }
}
output:
考试开始,请在答题纸上做答
考试科目为:数学
考试结束,请放下笔等待收卷
代理对象proxy的类型class com.sun.proxy.$Proxy0
代理对象proxy的父类class java.lang.reflect.Proxy

总结

联系我们

电话:400-123-4657

传真:+86-123-4567

地址:浙江 温州市 温州大道欧江大厦26188号

邮箱:admin@yina37.com

电话:400-123-4657 传真:+86-123-4567 地址:浙江 温州市 温州大道欧江大厦26188号
版权所有:Copyright © 2002-2024 中华视窗 版权所有 非商用版本 ICP备案编号:粤IP**********    网站地图