首页 > 编程语言 >【JavaSec】JDK动态代理初探

【JavaSec】JDK动态代理初探

时间:2024-08-18 12:51:20浏览次数:10  
标签:JDK show void 代理 public JavaSec user 初探 IUser

JDK动态代理初探

文章目录

  • 静态代理

用户接口:

public interface IUser {
    void show();

    void create();

    void update();
}

用户实现类:

/**
 * 实现类
 */

public class UserImpl implements IUser{
    public UserImpl(){

    }

    @Override
    public void show(){
        System.out.println("执行 => 展示");
    }

    @Override
    public void create() {
        System.out.println("执行 => 创建");
    }

    @Override
    public void update() {
        System.out.println("执行 => 更新");
    }


}

Proxy:

import java.lang.reflect.Method;

/**
 * 静态代理 实现IUser接口
 * 起到通过代理 有日志记录的功能
 */
public class UserProxy implements IUser{
    IUser user;
    public UserProxy(){
    }
    public UserProxy(IUser user){
        this.user = user;
    }

    @Override
    public void show(){
        user.show();
        System.out.println("Proxy:调用 => show");
    }

    @Override
    public void create() {
        user.create();
        System.out.println("Proxy:调用 => create");
    }

    @Override
    public void update() {
        user.update();
        System.out.println("Proxy:调用 => update");
    }
}

测试类:

import java.lang.reflect.Proxy;

public class ProxyTest {
    public static void main(String[] args){

        //创建一个对象  用接口效果一样 继承关系
        IUser  user = new UserImpl();
//        user.show();  无代理 直接访问
        //上代理  通过代理的好处 相当于租房找中介  有过程日志记录
        //静态代理
        IUser userProxy = new UserProxy(user);
        userProxy.show();
        userProxy.update();
        userProxy.create();
    }
}

效果:

image-20240818103836345

但是我们可以发现,上面的这种如果想对所有方法都进行代理,其实非常麻烦,每个函数方法都得写一遍

所以引出动态代理,可以自动找到对应的方法 不用重写了

  • 动态代理

ProxyTest:

//动态代理
//新建一个动态代理类  参数:要代理的接口、要做的事情、类加载器classloader
InvocationHandler userinvocationHandler = new UserInvocationHandler(user);
IUser userActiveProxy = (IUser) Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(), userinvocationHandler);

userActiveProxy.create();

userinvocationHandler:

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

public class UserInvocationHandler implements InvocationHandler {

    IUser user;

    public UserInvocationHandler(){

    }
    public  UserInvocationHandler(IUser user){
        this.user = user;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
        method.invoke(user, args);   // 接收到方法  利用invoke函数调用  参数时对象 和对应的方法值
        return null;
    }
}

image-20240818123723767

可以成功执行方法

但是没有 实现日志的效果 加一句话就ok了

image-20240818124209477

解释作用:

找到一个漏洞利用的点 B.f

入口是A(O) -> O.f2 意思:A接收参数O 然后调用O的f2方法

此时,如果O是动态代理类 O接收参数 进行调用f方法

O(X) invoke -> X.f 此时只需要把X传为B即可调用B.f

作用总结:

  1. readObject -> 反序列化自动执行
  2. invoke -> 有函数调用
  3. 拼接两条链

标签:JDK,show,void,代理,public,JavaSec,user,初探,IUser
From: https://blog.csdn.net/jayq1/article/details/141298379

相关文章

  • [Java SE/JDK] Java 注解机制
    1概述1.0引言面向切面编程思想(aop)与注解的结合,是实现复杂系统解藕的最终良药。软件工程的核心思想、目标追求,6字箴言:高内聚,低耦合。Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。jdk、spring、springbo......
  • JDK 17 以上 switch 语句的 变化
    在JDK17中,switch语句得到了显著的增强,引入了模式匹配(PatternMatching)等特性,使得代码更加简洁、高效。以下是JDK17中switch语句的主要用法和特点:1.格式变化在JDK17中,switch语句的格式发生了改变,主要体现在以下几个方面:冒号变为箭头:传统的switch语句中的冒号(:)在JDK17中被......
  • JDK源码——String相关
    StringJDK源码中的String类是Java中最常用的类之一,它提供了许多用于处理字符串的方法。以下是一些常用的String类方法:构造方法:String():创建一个空字符串。String(char[]value):根据字符数组创建一个新的字符串。String(byte[]bytes,intoffset,intlength):根据字节数......
  • C# WindowForm界面初探,窗体访问,绑定数据源,重载构造函数
    今日份主要内容C#WindowForm界面初探Winform项目模板,目录解析窗体对象控件对象界面设计基础1.控件?控件的本质是类,控件是构建用户界面(UserInterface)的基础,通过控件组合设计出符合需求的界面效果。相当于html的标签。基本要求:界面效果,布局交互(事件,委托)2.学习控件......
  • JDK8-17期间增加的新特性
    JDK新特性1.Lambda表达式在Java中,Lambda表达式是一种简洁的表示匿名函数的方法。它们提供了一种方式来传递代码作为数据,这在实现某些接口(特别是那些只包含一个抽象方法的接口,即函数式接口)时特别有用。Lambda表达式使得代码更加简洁,并提高了可读性。1.1.基本语法Java中Lambda表......
  • 面试官:JDK中都用了哪些设计模式?
    设计模式是前辈们经过实践验证总结的解决方案,帮助我们构建出更具可维护性、可扩展性和可读性的代码。当然,在面试的过程中,也会或多或少的被问到。那么今天,我们就来看一道设计模式中的常见面试问题:JDK中都用了哪些设计模式?我按照大家比较熟悉且好理解的方式,把JDK中使用的设计模......
  • 【ArrayList】JDK1.8源码详细注释 以及如何实现线程安全的链表
    ArrayList(JDK8)ArrayList有四个内部类,成员内部类Itr,成员内部类ListItr,静态内部类SubList,ArrayListSpliterator(暂时用不到)Itr是Iterator的实现类,支持正向遍历,ArrayList的iterator方法返回一个Itr对象ListItr是ListIterator的实现类,支持双向遍历,ArrayList的listIterator方法......
  • 华为云 CentOS 7.9安装jdk1.8教程
    1、通过yum安装:使用查找命令:yum-ylistjava*使用安装命令:yuminstall-yjava-1.8.0-openjdk.x86_64 (选择自己要安装的版本,名称必须与上面的名称一致)默认安装到:usr/lib/jvm然后查看版本:java-version 2、通过自己下载解压安装:可以选择自己要下载的具体版本,比较灵活,可......
  • 云计算课程设计(Prometheus+grafana+Flume+ganglia+mysql+jdk)
    一、准备环境prometheus下载地址:https://github.com/prometheus/prometheus/releases/download/v2.52.0-rc.1/prometheus-2.52.0-rc.1.windows-amd64.zipgrafana下载地址:https://dl.grafana.com/enterprise/release/grafana-enterprise-10.4.2.windows-amd64.zip......
  • GPU编程初探
    GPU(GraphicProcessingUnit),图像处理处理器,俗称显卡,主要处理图像、显示等任务(数据运算)CPU:逻辑运算GPGPU(GeneralPurposecomputingonGraphicProcessingUnit),通用GPU,主要处理通用计算任务。GPU性能指标:核心数GPU显存容量GPU计算峰值显存带宽CPU与GPU架构差异CPU+GPU......