Java安全基础 必备概念理解

Java安全基础 关键概念汇总

文章目录

  • Java安全基础 关键概念汇总
    • 前置知识
    • 1.构造器this以及包的使用
    • 2.继承
    • 3.重写/ 重载 / super
    • 4.多态
    • 5.区分`==`和`equals`方法
    • 6.toString的使用
    • 7.Object的概念
    • 8.static,final,代码块
      • static
      • 代码块
      • final
    • 9.动态代理
    • 10.类的动态加载
      • 1)类加载器含义(类的底层实现)
      • 2)ClassLoader
      • 3)类加载器的核心方法
      • 4)**双亲委派模型过程**(强调逻辑关系不是继承关系)
      • 5)**双亲委派模型的系统实现**
      • 6)ClassLoader(类加载机制)
      • 7)类加载流程(关注加载后是否初始化)
      • 8)动态类的加载方法
      • 安全关注:实现加载任意类(字节码)

前置知识

了解Java基本面向对象语法以及反射

1.构造器this以及包的使用

假设在Person类中

this.name=name this指代Person类的对象等价于Person.name=name

就是 当前类的引用

应用:主要作用就是区分类中的成员属性和变量(比如同名时进行区分)

包中使用遵循见包起名import导入

2.继承

关键字extends

经典的父子关系,子类可以继承父类的public成员属性和成员方法

但私有的private无法继承

子类可以在父类的基础上有自己的特性

3.重写/ 重载 / super

重写概念:子类继承父类后,对同名同参数的方法进行覆盖

与重载区分开:重载是同名跟紧不同参数执行不同方法(注意几个参数)

关键词super 可以直接调用父类的构造方法,成员变量,成员方法

应用:一般多用于 重写后 区分子类和父类方法以及属性(同名)

4.多态

对象的多态性核心:父类的指针指向子类对象

例如 我们创建了父类Animal 子类Dog Dog继承了Animal

典型例子:Animal dog=new Dog(); 的代码

实际调用的是 父类中声明过的 子类方法和属性

**父类的指针指向子类对象 **换句话说就是 具体实现的类还是子类new Dog()

不过声明 对象时 为 缩小的能力声明

多态性

  1. 变量类型声明只是调用能力声明
  2. 子类型对象的能力一定不小于父类型对象的能力;
  3. 真正的行为表现要看其具体对象的类型,而不是看引用变量的类型。

5.区分==equals方法

equals:比较两个内存地址值是否相同

Dog dog1=new Dog(); //在new时分配对象产生内存空间
Dog dog2=new Dog();
dog1.equals(dog2)//返回False
对象具体的分配内存空间不同

== :判断具体的值是否相同

6.toString的使用

输出 引用对象,自动调用类中的toString方法

7.Object的概念

Java中所有对象的根父类

8.static,final,代码块

static

不用初始化创建对象 就可以调用成员方法和属性类名.属性 //类名. 方法名()

代码块

1.代码块{}

2.静态代码块statci{}

3.构造器Dog(){}

调用顺序 静态代码块---->代码块----->构造器

为什么是这个调用顺序了?

详见10.类的动态加载

final

可以理解为 最后 的修改

final 修饰 类 类不可被调用

final 修饰 方法 方法不可被重写

final 修饰变量 变量不可被修改

当然通过反射也是可以修改

9.动态代理

参考:https://www.liaoxuefeng.com/wiki/1252599548343744/1264804593397984

回顾一下

Java的classinterface的区别:

  • 可以实例化class(非abstract);

  • 不能实例化interface

代理含义:通过继承和多态实现间接调用

动态代码:运行期动态创建某个interface的实例,没有实现类但是在运行期动态创建了一个接口对象的方式

动态代理具体实现过程

  1. 定义一个InvocationHandler实例,它负责实现接口的方法调用(具体实现);

  2. 通过

    Proxy.newProxyInstance()
    

    创建接口实例

    interface
    

    它需要3个参数:

    1. 使用的ClassLoader,通常就是接口类的ClassLoader
    2. 需要实现的接口数组,至少需要传入一个接口进去;
    3. 用来处理接口方法调用的InvocationHandler实例。
  3. 将返回的Object强制转型为接口。

例子

public class Main {public static void main(String[] args) {InvocationHandler handler = new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(method);if (method.getName().equals("morning")) {System.out.println("Good morning, " + args[0]);}return null;}};Hello hello = (Hello) Proxy.newProxyInstance(Hello.class.getClassLoader(), // 传入ClassLoadernew Class[] { Hello.class }, // 传入要实现的接口handler); // 传入处理调用方法的InvocationHandlerhello.morning("Bob");}
}interface Hello {void morning(String name);
}

实现 代理.方法名 传递方法名 到具体实现类调用方法名

应用:无危害类的.abc方法----->无危害类代理危害类----->触发 危害类.abc方法

非开发预期的危险调用 CC1链

10.类的动态加载

image-20240317184237724

1)类加载器含义(类的底层实现)

image-20240317162740230

类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因。在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字节流,完成这个动作的代码块就是类加载器。这一动作是放在Java虚拟机外部去实现的,以便让应用程序自己决定如何获取所需的类

类加载器的开放性使得Java应用程序可以灵活地从不同的来源获取类的二进制字节流(字节码),包括从ZIP包、网络、运行时计算、其他文件

启动类加载器(Bootstrap ClassLoader):

这个类加载器负责将\lib目录下的类库加载到虚拟机内存中,用来加载java的核心库,此类加载器并不继承于java.lang.ClassLoader,不能被java程序直接调用,代码是使用C++编写的.是虚拟机自身的一部分.

扩展类加载器(Extendsion ClassLoader):

这个类加载器负责加载\lib\ext目录下的类库,用来加载java的扩展库,开发者可以直接使用这个类加载器.

应用程序类加载器(Application ClassLoader):

这个类加载器负责加载用户类路径(CLASSPATH)下的类库,一般我们编写的java类都是由这个类加载器加载,这个类加载器是CLassLoader中的getSystemClassLoader()方法的返回值,所以也称为系统类加载器.一般情况下这就是系统默认的类加载器.

除此之外,我们还可以加入自己定义的类加载器,以满足特殊的需求,需要继承java.lang.ClassLoader类

2)ClassLoader

所有的Java类都必须经过JVM加载后才能运行,ClassLoader的主要作用就是Java类文件的加载。在JVM类加载器中最顶层的是Bootstrap ClassLoader(引导类加载器)Extension ClassLoader(扩展类加载器)App ClassLoader(系统类加载器)AppClassLoader是默认的类加载器,如果类加载时我们不指定类加载器的情况下

默认会使用AppClassLoader加载类,

ClassLoader.getSystemClassLoader()返回的系统类加载器也是AppClassLoader

某些时候我们获取一个类的类加载器时候可能会返回一个null值,如:java.io.File.class.getClassLoader()将返回一个null对象,因为java.io.File类在JVM初始化的时候会被Bootstrap ClassLoader(引导类加载器)加载(该类加载器实现于JVM层,采用C++编写),我们在尝试获取被Bootstrap ClassLoader类加载器所加载的类的ClassLoader时候都会返回null

3)类加载器的核心方法

  1. loadClass(加载指定的Java类)
  2. findClass(查找指定的Java类)
  3. findLoadedClass(查找JVM已经加载过的类)
  4. defineClass(定义一个Java类)
  5. resolveClass(链接指定的Java类)

4)双亲委派模型过程(强调逻辑关系不是继承关系)

image-20240317200648600

双亲委派模型的工作过程为:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的加载器都是如此,因此所有的类加载请求都会传给顶层的启动类加载器,只有当父加载器反馈自己无法完成该加载请求(该加载器的搜索范围中没有找到对应的类)时,子加载器才会尝试自己去加载。

代码还会偷懒,不重复加载(向上寻找想偷懒)

使用双亲委派模型的好处在于Java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存在在rt.jar中,无论哪一个类加载器要加载这个类

因此带有优先级的层次关系 通过查询路径反应

最终都是委派给处于模型最顶端的Bootstrap ClassLoader(由Java实现C++编写,尝试获取被Bootstrap ClassLoader类加载器所加载的类附属性 的ClassLoader时候都会返回null)进行加载 就是 副属性 parent为null

因此Object类在程序的各种类加载器环境中都是同一个类。相反,如果没有双亲委派模型而是由各个类加载器自行加载的话,如果用户编写了一个java.lang.Object的同名类并放在ClassPath中,那系统中将会出现多个不同的Object类,程序将混乱。因此,如果开发者尝试编写一个与rt.jar类库中重名的Java类,可以正常编译,但是永远无法被加载运行。

5)双亲委派模型的系统实现

在java.lang.ClassLoader的loadClass()方法中,先检查是否已经被加载过,若没有加载则调用父类加载器的loadClass()方法,若父加载器为空则默认使用启动类加载器作为父加载器。如果父加载失败,则抛出ClassNotFoundException异常后,再调用自己的findClass()方法进行加载

6)ClassLoader(类加载机制)

Java程序在运行前需要先编译成class文件,Java类初始化的时候会调用java.lang.ClassLoader加载类字节码,ClassLoader会调用JVM的native方法(defineClass0/1/2)来定义一个java.lang.Class实例。

7)类加载流程(关注加载后是否初始化)

image-20240317170731088

让我们复习一下代码块

初始化

1.代码块{}

2.静态代码块statci{} 任何静态相关的操作自动调用

创建实例(过程中包括初始化)

3.构造器Dog(){}

解释为什是这个调用顺序 静态代码块---->代码块----->构造器

static {} 就是在“类初始化”的时候调⽤的,⽽ {} 中的代码会放在构造函数的 super() 后⾯,但在当前构造函数内容的前⾯

8)动态类的加载方法

1.Class.forName("类名")默认会初始化被加载类的静态属性和方法

2.ClassLoader.loadClass默认不会初始化类方法

安全关注:实现加载任意类(字节码)

image-20240317200648600

逻辑上EXT和APP关系如上图,但是继承上同级,都返回父类URLClassLoader查询

image-20240317183005265

URLClassloader : 支持 file://,jar://,http://

加载字节码方式(实例化)

1.通过反射加载defineClass(protected)

image-20240317211842192

2.Unsafe加载字节码

image-20240317212222841
方法为public,但是无法取unsafe,通过反射静态属性拿unsafe实例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教程】APP加固的那些小事情

摘要 APP加固是保护APP代码逻辑的重要手段,通过隐藏、混淆、加密等操作提高软件的逆向成本,降低被破解的几率,保障开发者和用户利益。本文将介绍APP加固常见失败原因及解决方法,以及处理安装出现问题的情况和资源文件加固策略选择…

【InternLM 笔记】OpenXLAB浦源的基本操作

OpenXLab网址 网址:OpenXLab浦源 模型 创建模型 页面右上角选择【创建】然后选择【创建模型】 创建模型的页面如下 感觉页面中的提示信息填写相应的内容,全部填完后点页面下方的【立即创建】完成模型的创建 模型上传 安装所需的工具 apt install …

目标检测——玉米叶感染数据集

一、重要性 首先,玉米作为世界上重要的粮食作物之一,其生长状况直接影响到粮食产量和粮食安全。玉米叶感染是玉米生长过程中常见的病害之一,会导致玉米叶片出现肿胀、皱缩、扭曲变形等症状,严重时甚至可能形成瘤状物。因此&#…

【LIMS】微服务

目录 一、服务解决方案-Spring Cloud Alibaba1.1选用原因(基于Spring Cloud Alibaba的试用场景)1.2 核心组件使用前期规划 部署 nacos部署 mino使用JavaFreemarker模板引擎,根据XML模板文件生成Word文档使用JavaFlowable 工作流引擎前端 -vue…

js获取年月日

const date new Date()const options { year: numeric, month: 2-digit, day: 2-digit }const dateString date.toLocaleDateString(zh-CN, options)const [year, month, day] dateString.split(/)console.log(year, month, day) 人工智能学习网站: https://ch…

Kubernetes 项目整体布局 el-container

整体布局整体布局 你可能会去敲不同的项目,有很多种平台。那么其实都是可以复用的。唯一不同的就是main里面的内容是不同的,边框架子都是相同的。其实框架是不怎么变化的,变化的是main里面。 src/layout/Layout.vue 这里需要新增一个页面Lay…

高效求解!图片转换方法大揭秘,清晰度零损失!

在数字时代,图片转换是我们处理和共享图像时经常面临的任务之一。随着不同平台、应用程序和需求的不断增多,高效的图片转换方法变得至关重要。本文将为您揭秘一系列高效的图片转换方法,确保在转换过程中清晰度零损失。 无论是为了适应不同的…

Docker Desktop 安装 ClickHouse 超级简单教程

Docker desktop 安装 clickhouse 超级简单 文章目录 Docker desktop 安装 clickhouse 超级简单 什么是 Docker ?安装下准备安装Docker配置安装 ClickHouse配置数据库密码DBeaver 测试创建表总结 什么是 Docker ? 下载 Docker desktop Docker Desktop …

三菱FX3U/FX5U的采集方式有哪些?如何快速采集?

在工业自动化领域,PLC(可编程逻辑控制器)扮演着至关重要的角色。三菱FX3U和FX5U作为三菱电机公司推出的两款经典PLC产品,广泛应用于各种工业自动化控制系统中。为了更好地实现对这些PLC设备的数据采集与远程控制,我们引…

java数据结构与算法刷题-----LeetCode134. 加油站

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 贪心2. 动态规划 1. 贪心 解题思路:时间复杂度O(…

太阳辐射传感器的工作原理

TH-FS1太阳辐射传感器是一种专门用于测量太阳辐射能量的设备,它可以广泛应用于太阳能利用、气象、农业、建筑材料老化以及大气污染等部门。太阳辐射传感器有多种类型,其中太阳总辐射传感器和热电式太阳总辐射传感器是较为常见的两种。 太阳总辐射传感器主…

华为云HECS+NODEJS开启WEB服务后无法外网访问

接上篇:使用华为云HECS服务器nodejs开启web服务-CSDN博客 目录 1.首先确认安全组是开放了端口的。 2.然后开启端口 1.首先确认安全组是开放了端口的。 这里我是用的3000端口 然后需要检查一下服务器防火墙是否开启了这个端口。 输入命令检查一下3000端口是否开…

基于Django兴趣班预约管理系统

技术:pythonmysqlvue 一、系统背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大…

每日汇评:黄金等待金叉确认和央行裁决

金价周二早盘徘徊在每盎司2160美元附近,等待主要央行的决定; 尽管美债收益率疲软,但在日本央行和澳央行做出谨慎裁决之前,美元依然坚挺; 随着RSI指数再次转为看涨,黄金价格在日线图上试探金叉形态&#xff…

算法沉淀——贪心算法二(leetcode真题剖析)

算法沉淀——贪心算法二 01.最长递增子序列02.递增的三元子序列03.最长连续递增序列04.买卖股票的最佳时机 01.最长递增子序列 题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/ 给你一个整数数组 nums ,找到其中最长严格递增子…

空间解析几何之直线与平面:推导直线与直线、直线与平面交点

空间解析几何——直线与平面 三维空间中的直线和平面与二维空间中的性质有一定的类似之处,但是其相交关系的求解方式有所差异。本文回顾了三维空间中直线和平面的解析表达,然后推导线-线、线-面交点。 平面 空间平面的表达式为: A x B y…

NCV33172DR2G运算放大器芯片中文资料规格书PDF数据手册引脚图产品概述功能

产品概述: MC33071/72/74 系列单片运算放大器采用了带有创新设计概念的优质双极制造。此类器件根据放大器在 180 A 下运行,提供 1.8 MHz 增益带宽积和 2.1 V/s 摆率,而不采用 JFET 器件技术。尽管此系列可基于分割电源运行,但它尤…

Linux服务器部署若依(ruoyi-vue),从购买服务器到部署完成保姆级教程

零、购买服务器 Huawei Cloud EulerOS 还是 centos7,纠结了一段时间,了解到EulerOS是对centos8的延续版本,相当于官方不对centos8继续维护了, 最后还是选 CentOS 7.9 64bit,网上可查找的工具更多且官方还在持续维护。…

PHP反序列化--_wakeup()绕过

一、漏洞原理&#xff1a; 二、靶场复现: 进入靶场&#xff0c;分析源代码&#xff1a; <?php error_reporting(0); class secret{var $fileindex.php;public function __construct($file){$this->file$file;}function __destruct(){include_once($this->file);ech…

算法沉淀——贪心算法三(leetcode真题剖析)

算法沉淀——贪心算法三 01.买卖股票的最佳时机 II02.K 次取反后最大化的数组和03.按身高排序04.优势洗牌 01.买卖股票的最佳时机 II 题目链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/ 给你一个整数数组 prices &#xff0c;其中 pric…