当前位置: 首页 > news >正文

Java动态代理的使用和安全问题

前言:

java的动态代理是指进行明确的分工的操作(多接口  比如我是酒店的老板  有人找我合作 需要先经过前台 我的助理  而不是直接找我)

序列化 :为什么序列化  序列化的对象是一个类 我们也叫对象   class一堆东西里面有很多函数方法 假如我现在是app我想调用web上写好的一个对象 我不能直接把那个对象传输过来吧  

因为这个对象在web上假如web使用的是php那他不认识啊  这个时候就需要序列化一下 把他序列化成方便传输的形式  从而实现互通  对方反序列之后就能直接使用

记住java反序列的流程  :  序列化的 对象是 一个对象   结果是输出一个装着对象的文件

反:对象是一个文件  目标是一个对象

动态代理的实现

public interface User {   //创建一个接口
    void sayxiaodi(String name,int money);
    

}

上边这个是接口  下面这个是创建的使用

public class UserImpt implements User{   //创建类调用User接口

    @Override
    public void sayxiaodi(String name,int money) {  //使用接口的sayxiaodi方法
        System.out.println("hi "+name+",i want sign up");  //name是最后实现的时候  用户设置的
        System.out.println("i have paid "+money);    //这个是用户的缴费
    }
}

反射方法获取  实例化接口的类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//因为是反射 调用其他的类所以要使用   invoke接口
public class UserImptInhander implements InvocationHandler {
    private Object target;

    public UserImptInhander(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("hello,i am "+args[0]);            //这个是接口被触发的时候就会显示
        Object invoke = method.invoke(target, args);        //使用    UserImpt  的类内的方法
        System.out.println("okay,you are my baby");
        return invoke;
    }
}

调用接口

import java.lang.reflect.Proxy;

public class UserProxy  {

    public static void main(String[] args) {
        // 创建目标对象
        User user = new UserImpt();

        // 创建 userImptInhander
        UserImptInhander userImptInhander = new UserImptInhander(user);


        // 创建代理对象
        User proxy=(User)Proxy.newProxyInstance(
                UserImpt.class.getClassLoader(),
                new Class<?>[]{User.class},
                userImptInhander
        );

        proxy.sayxiaodi("xiaodi",3000);  //用户的设置


        proxy.sayxiaodi("moonsec",5000);


    }

}

我们运行代理

这个就是自动回复的使用  

看一下调用的顺序

打个断点然后点击上面的蜘蛛

然后点f7进行步入

invoke()这个函数就是出现在反射机制中   用户调用其他类的方法

arg[0] 就是表示参数

为什么学这个动态的代理:主要是了解链:许多链就是调用使用接口的一些类  然后如果其他的类中有

Runtime.getRuntime().exec("calc");

那就能触发命令执行   

因为看到了他的跳转机制所以我们直接 添加一句   

我们运行的是

代理对象怎么触发计算机了

这个有个触发链 

Userproxy
    Userimptlnhead
        Userimptln
                内的Runtime.getruntime("CALC")

上面这个就是动态代理的触发链

主要的学习目标就是 :了解invoke()导致的链的触发

相关文章:

  • WPS二次开发系列:以自动播放模式打开PPT文档
  • 【第五章】作业
  • MYSQL运维常用SQL
  • 中医五行学说的系统性扩展讲解
  • 计算机控制系统的最小拍控制器设计及仿真分析
  • 【区块链安全 | 第二篇】区块链概念详解
  • 鸿蒙开发:openCustomDialog关闭指定Dialog
  • Axure RP9.0 教程:左侧菜单列表导航 ( 点击父级菜单,子菜单自动收缩或展开)【响应式的菜单导航】
  • Qt在模块依靠情况下资源文件名称和资源名称的使用限制
  • 微服务架构-Feign声明式调用
  • BoomCut AI 技术创建本地化的营销视频
  • three入门,创建一个长方体、认识场景、模型、光源、相机?渲染器
  • 【蓝桥杯】真题 路径(数论+dp)
  • 苹果企业签名经常掉签吗?
  • 类与对象(三)
  • uv - Getting Started 开始使用 [官方文档翻译]
  • 1.认识Excel
  • LRU算法实现
  • 学习 - C++ 全栈聊天项目(1)架构概述和登录界面
  • 内核编程十三:进程状态详解
  • 变身 变装 wordpress/广州推广优化
  • 成都网站开发工资/网站制作开发
  • 广州网捷网站建设技术有限公司/百度提问登录入口
  • workerman 做网站/怎么制作网站详细流程
  • 做注册任务的网站有哪些/域名
  • 画网站 模板/牛排seo系统