Java学习之动态代理篇

Java学习之动态代理篇0x00前言在后面的漏洞研究的学习中,必须要会的几个知识点。反射机制和动态代理机制。至于反射的前面已经讲到过了,这里就不做更多的赘述了。0x01动态代理这里先来讲一

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

Java学习之动态代理篇

0x00 前言

在后面的漏洞研究的学习中,必须要会的几个知识点。反射机制和动态代理机制。至于反射的前面已经讲到过了,这里就不做更多的赘述了。

0x01 动态代理

这里先来讲一些动态代理的一个定义。

动态代理是给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。

([手动滑稽]其实动态代理就是一个中间商,间接的把东西送到客户手里,但是在此之前肯定要赚点差价)

我们开发中使用动态代理的主要目的是在不改变目标对象方法的情况下对方法进行增强。

这里再普及几个概念:

1. 真实对象:被代理的对象

2. 代理对象:

3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的

我们来写一段正常情况下使用真实对象调用方法的一段代码。

computer接口代码:

package com.test.web.proxy;

public interface computer {
    public String method(double money);
    String show();
}


lenveo类代码:

package com.test.web.proxy;

public class lenveo implements computer{
    @Override
    public String method(double money) {
        System.out.println("花了+"+money+"买的电脑");
        return "电脑";

    }

    @Override
    public String show() {
        System.out.println("展示电脑");

        return "展示电脑";
    }
}

test类代码:

package com.test.web.proxy;

public class test1 {
    public static void main(String[] args) {
        lenveo lenveo = new lenveo();
        String method = lenveo.method(8000);
        String show = lenveo.show();
        System.out.println(show);
        System.out.println(method);




    }
}

这是一段正常的代码,如果我们需要在不改动其他类代码的情况下对他进行增强,那么就可以使用到动态代理。

下面来看看动态代理的实现步骤,来根据步骤实现动态代理。

package com.test.web.proxy;

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

public class test {
    public static void main(String[] args) {
        lenveo lenveo = new lenveo();


                                            //获取传入类加载器                    //获取传入真实对象所有接口
        computer proxy = (computer) Proxy.newProxyInstance(lenveo.getClass().getClassLoader(), lenveo.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("invoke方法执行了");
                Object obj = method.invoke(lenveo, args);

                return obj;
            }
        });
        String method = proxy.method(3000);
        System.out.println(method);

    }
}

这里的Proxy.newProxyInstance方法传入了三个参数分别是:

1.类的加载器:new出来的真实对象.getClass().getClassLoader()

2.接口数组:new出来的真实对象.getClass().getInterfaces()

3.处理器:new InvocationHandler() 

使用动态代理,代理对象调用任意方法,代理的invoke方法都会执行。

invoke参数:

1.proxy:代理对象

2.method:代理对象调用的方法,被封装成的对象

3.args:代理对象调用方法适合传递的实际参数

0x02 结尾

好了,又一篇文章水完,动态代理机制还是比较重要了的。这里也只是一些简单的动态代理内容,后面有空了再更新一下动态代理。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119933.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • psutil的Process python获取进程信息「建议收藏」

    psutil的Process python获取进程信息「建议收藏」系统进程信息psutil.Process()1.创建指定进程号的对象s=psutil.Process(1701)2.进程PID:pids.pid3.进程名称:name()s.name()4.进程当前状态:status()s.status()5.进程是否还在运行:is_running()返回此进程是否正在运行。它还检查PID是否已被另一个进程重用…

    2022年6月9日
  • 盘点六大开源云计算平台「建议收藏」

    开源技术目前已经运用到云计算的每一个地方,在Hypervisor层面,KVM、Xen都是很优秀的虚拟化底层引擎,在管理接口方面,Libvirt是一个被广泛使用的组件,而Eucalyptus、OpenCloud、Convirt、Nebula等都是很不错的云计算框架和管理软件。目前的OpenStack开源云框架也受到了大多数主流厂商的支持和追捧。  云计算的最终目的是实现灵活、自由的资源分

    2022年4月11日
  • C++代码算法题:(5).最长回文子串

    C++代码算法题:(5).最长回文子串题目及要求:给你一个字符串s,找到s中最长的回文子串。提示:1<=s.length<=1000s仅由数字和英文字母(大写和/或小写)组成原创代码:classSolution{public:stringlongestPalindrome(strings){intbegin=0;//每个当前子串的开头intend=0;//每个当前子串的末尾intvalue=0;//判断条件使用。条

    2022年6月10日
  • 用GVIM/VIM写Verilog——VIM配置分享「建议收藏」

    用GVIM/VIM写Verilog——VIM配置分享「建议收藏」使用VIM或GVIM最基本的配置,不包含任何插件相关的设置,VIM用于写verilog,非常欢迎大家在评论区分享讨论。本文不进行插件的配置,不进行基本使用方式与使用技巧的说明,仅作为基本配置的分享交流用GVIM/VIM写Verilog——VIM配置分享基本配置几点说明1,禁用方向键,使用jk代替ESC2,自动补全命令配置3,进行版权声明的设置4,一些其他映射基本配置setnocompatible”不兼容visyntaxon”语法高亮度显示setnoerrorbells”.

    2022年9月30日
  • 匈牙利命名法[通俗易懂]

    匈牙利命名法[通俗易懂]匈牙利命名法:广泛应用于象MicrosoftWindows这样的环境中。Windows编程中用到的变量(还包括宏)的命名规则匈牙利命名法,这种命名技术是由一位能干的Microsoft程序员查

    2022年7月2日
  • it领域的摩尔定律_裴蜀定理

    it领域的摩尔定律_裴蜀定理每十八个月,计算机等IT产品的性能会翻一番;或者说相同性能的计算机等IT产品,每十八个月价钱会降一半。

    2022年8月6日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号