java 代码审计-语言基础篇

admin 2025年6月18日22:59:04评论0 views字数 12143阅读40分28秒阅读模式
文章作者:Raybye
Java是一门面向对象的计算机编程语言,吸收了C语言的各种优点,具有功能强大和简单易用两个特征。Java语言是最典型的静态面向对象编程语言的代表,具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可用于编写桌面应用程序、Web应用程序、分布式系统,嵌入式系统应用程序和Android移动平台等 。
但目前在企业中主流还是用于Web应用程序和Android移动平台,到目前为止Java在web应用模块框架发展的也是相当成熟,本篇文章简单的对上篇《Java代码审计入门指南》中Java语言基础的部分进行大致的总结,并对Java代码审计中用到的方法等进行重点标注。Java 语言支持的数据类型分为两种:基本数据类型(Primitive Type)和引用数据类型(Reference Type)。
java 代码审计-语言基础篇
图   Java数据类型结构图
1.基本数据类型及其转换

1.1基本数据类型

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
java 代码审计-语言基础篇
图 java八种基本数据类型
byte型:
byte 数据类型是8位、有符号的,以二进制补码表示的整数;取值范围-128~127;即-2^7~2^7-1,默认值为 0;
short型:
short 数据类型是 16 位、有符号的以二进制补码表示的整数;取值范围 -32768~32767即-2^15-2^15 - 1;默认值为 0;
int型:
int 数据类型是32位、有符号的以二进制补码表示的整数;-2147483648~ 2147483647即-2^31~2^31 - 1;默认值为 0 ;整数通常是int型
long型:
long 数据类型是 64 位、有符号的以二进制补码表示的整数;最小值是 -9223372036854775808~9223372036854775807即-2^63~2^63 -1;默认值为0L;
float型:
float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;默认值是 0.0f;
double型:
double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;浮点数的默认类型为 double 类型;默认值是 0.0d;
boolean型:
boolean数据类型表示一位的信息;只有两个取值:true 和 false;这种类型只作为一种标志来记录 true/false 情况;默认值是 false;
char型:
char 类型是一个单一的 16 位 Unicode 字符;最小值是 u0000(十进制等效值为 0);最大值是 uffff(即为 65535);char 数据类型可以储存任何字符;
1.2类型转换

自动类型转换
运算中,不同类型的数据先转化为同一类型之后才能进行运算。转换从低级到高级。java 代码审计-语言基础篇
数据类型转换规则:
  • 不能对boolean类型进行类型转换。
  • 不能把对象类型转换成不相关类的对象。
  • 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
  • 转换过程中可能导致溢出或损失精度
常见转换:byte—>short—> int —> long
float —> double
强制类型转换
  • 条件:转换的数据类型必须是兼容的。
  • 格式:(type)value type是要强制类型转换后的数据类型
2.引用数据类型

引用数据类型建立在基本数据类型的基础上,包括数组、类和接口。引用数据类型是由用户自定义,用来限制其他数据的类型。另外,Java 语言中不支持 C++ 中的指针类型、结构类型、联合类型和枚举类型。
2.1类

类是包括是用户自定义的和Java内置封装的类,下面主要对Java内置的几个类进行简单介绍,包括math类,Character 类,String 类,StringBuffer 和StringBuilder 类
Math类
Java 的 Math 包含了用于执行基本数学运算的属性和方法,下表是math类常用的方法,其中标红的是代码审计工作中最常见的方法。
序号
方法
描述
1
xxxValue()
将 Number 对象转换为xxx数据类型的值并返回
2
compareTo()
将number对象与参数比较
3
equals()
判断number对象是否与参数相等
4
valueOf()
返回一个 Number 对象指定的内置数据类型
5
toString()
以字符串形式返回值
6
parseInt()
将字符串解析为int类型
7
abs()
返回参数的绝对值
8
ceil()
返回大于等于( >= )给定参数的的最小整数,类型为双精度浮点型
9
floor()
返回小于等于(<=)给定参数的最大整数
10
rint()
返回与参数最接近的整数。返回类型为double。
11
round()
它表示四舍五入,算法为 Math.floor(x+0.5),即将原来的数字加上 0.5 后再向下取整,所以,Math.round(11.5) 的结果为12,Math.round(-11.5) 的结果为-11
12
min()
返回两个参数中的最小值
13
max()
返回两个参数中的最大值
14
exp()
返回自然数底数e的参数次方
15
log()
返回参数的自然数底数的对数值
16
pow()
返回第一个参数的第二个参数次方
17
sqrt()
求参数的算术平方根
18
sin()
求指定double类型参数的正弦值
19
cos()
求指定double类型参数的余弦值
20
tan()
求指定double类型参数的正切值
21
asin()
求指定double类型参数的反正弦值
22
acos()
求指定double类型参数的反余弦值
23
atan()
求指定double类型参数的反正切值
24
atan2()
将笛卡尔坐标转换为极坐标,并返回极坐标的角度值
25
toDegrees()
将参数转化为角度
26
toRadians()
将角度转换为弧度
27
random()
返回一个随机数
表 Math类常用方法
Character 类
Java的Character 类用于对单个字符进行操作。Character 类在对象中包装一个基本类型 char 的值,下面第一个表是Character类常用的方法,其中标红的是代码审计工作中最常见的方法。第二个表是Java的转义序列
序号
方法
描述
1
isLetter()
是否是一个字母
2
isDigit()
是否是一个数字字符
3
isWhitespace()
是否是一个空白字符
4
isUpperCase()
是否是大写字母
5
isLowerCase()
是否是小写字母
6
toUpperCase()
指定字母的大写形式
7
toLowerCase()
指定字母的小写形式
8
toString()
返回字符的字符串形式,字符串的长度仅为1
表 Character类常用方法
转义序列
描述
t
在文中该处插入一个tab键
b
在文中该处插入一个后退键
n
在文中该处换行
r
在文中该处插入回车
f
在文中该处插入换页符
'
在文中该处插入单引号
"
在文中该处插入双引号
\
在文中该处插入反斜杠
表 java的转义序列
String 类
在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。下表是String 类常用的方法,其中标红的是代码审计工作中最常见的方法。
序号
方法
描述
1
char charAt(int index)
返回指定索引处的 char 值
2
int compareTo(Object o)
把这个字符串和另一个对象比较
3
int compareTo(String anotherString)
按字典顺序比较两个字符串
4
int compareToIgnoreCase(String str)
按字典顺序比较两个字符串,不考虑大小写
5
String concat(String str)
将指定字符串连接到此字符串的结尾
6
boolean contentEquals(StringBuffer sb)
当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真
7
static String copyValueOf(char[] data)
返回指定数组中表示该字符序列的 String
8
static String copyValueOf(char[] data, int offset, int count)
返回指定数组中表示该字符序列的 String
9
boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束
10
boolean equals(Object anObject)
将此字符串与指定的对象比较
11
boolean equalsIgnoreCase(String anotherString)
将此 String 与另一个 String 比较,不考虑大小写
12
byte[] getBytes()
 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
13
byte[] getBytes(String charsetName)
使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
14
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符从此字符串复制到目标字符数组
15
int hashCode()
返回此字符串的哈希码
16
int indexOf(int ch)
返回指定字符在此字符串中第一次出现处的索引
17
int indexOf(int ch, int fromIndex)
返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索
18
int indexOf(String str)
 返回指定子字符串在此字符串中第一次出现处的索引
19
int indexOf(String str, int fromIndex)
返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
20
String intern()
 返回字符串对象的规范化表示形式
21
int lastIndexOf(int ch)
 返回指定字符在此字符串中最后一次出现处的索引
22
int lastIndexOf(int ch, int fromIndex)
返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索
23
int lastIndexOf(String str)
返回指定子字符串在此字符串中最右边出现处的索引
24
int lastIndexOf(String str, int fromIndex)
 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
25
int length()
返回此字符串的长度。
26
boolean matches(String regex)
告知此字符串是否匹配给定的正则表达式。
27
boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
测试两个字符串区域是否相等
28
boolean regionMatches(int toffset, String other, int ooffset, int len)
测试两个字符串区域是否相等
29
String replace(char oldChar, char newChar)
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
30
String replaceAll(String regex, String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串
31
String replaceFirst(String regex, String replacement)
 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
32
String[] split(String regex)
根据给定正则表达式的匹配拆分此字符串
33
String[] split(String regex, int limit)
根据匹配给定的正则表达式来拆分此字符串
34
boolean startsWith(String prefix)
测试此字符串是否以指定的前缀开始
35
boolean startsWith(String prefix, int toffset)
测试此字符串从指定索引开始的子字符串是否以指定前缀开始
36
CharSequence subSequence(int beginIndex, int endIndex)
 返回一个新的字符序列,它是此序列的一个子序列
37
String substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串
38
String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串
39
char[] toCharArray()
将此字符串转换为一个新的字符数组
40
String toLowerCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为小写
41
String toLowerCase(Locale locale)
 使用给定 Locale 的规则将此 String 中的所有字符都转换为小写
42
String toString()
 返回此对象本身(它已经是一个字符串!)
43
String toUpperCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为大写
44
String toUpperCase(Locale locale)
使用给定 Locale 的规则将此 String 中的所有字符都转换为大写
45
String trim()
返回字符串的副本,忽略前导空白和尾部空白
46
static String valueOf(primitive data type x)
返回给定data type类型x参数的字符串表示形式
47
contains(CharSequence chars)
判断是否包含指定的字符系列
48
isEmpty()
判断字符串是否为空
表 String类常用方法
StringBuffer 和 StringBuilder 类
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。而StringBuilder 和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)下表是StringBuffer类常用的方法,其中标红的是代码审计工作中最常见的方法。
序号
方法
描述
1
public StringBuffer append(String s)
将指定的字符串追加到此字符序列
2
public StringBuffer reverse()
 将此字符序列用其反转形式取代
3
public delete(int start, int end)
移除此序列的子字符串中的字符
4
public insert(int offset, int i)
将 int 参数的字符串表示形式插入此序列中
5
insert(int offset, String str)
将 str 参数的字符串插入此序列中
6
replace(int start, int end, String str)
使用给定 String 中的字符替换此序列的子字符串中的字符
7
int capacity()
返回当前容量
8
char charAt(int index)
返回此序列中指定索引处的 char 值
9
void ensureCapacity(int minimumCapacity)
确保容量至少等于指定的最小值。
10
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符从此序列复制到目标字符数组 dst
11
int indexOf(String str)
返回第一次出现的指定子字符串在该字符串中的索引
12
int indexOf(String str, int fromIndex)
从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引
13
int lastIndexOf(String str)
返回最右边出现的指定子字符串在此字符串中的索引
14
int lastIndexOf(String str, int fromIndex)
返回 String 对象中子字符串最后出现的位置
15
int length()
 返回长度(字符数)
16
void setCharAt(int index, char ch)
将给定索引处的字符设置为 ch
17
void setLength(int newLength)
设置字符序列的长度
18
CharSequence subSequence(int start, int end)
返回一个新的字符序列,该字符序列是此序列的子序列
19
String substring(int start)
返回一个新的 String,它包含此字符序列当前所包含的字符子序列
20
String substring(int start, int end)
返回一个新的 String,它包含此序列当前所包含的字符子序列
21
String toString()
返回此序列中数据的字符串表示形式
表 StringBuffer类常用方法
2.2数组

Java 语言中数组是用来存储固定大小的同类型元素的集合,声明表示一般为dataType[] arrayName或 dataType arrayName[]; 数组创建一般使用new 方法,多维数组可以看成数组的数组,数组的操作一般使用java.util.Arrays 类它提供的所有方法都是静态的。下表是数组常用的方法,其中标红的是代码审计工作中最常见的方法。
序号
方法
说明
1
public static int binarySearch(Object[] a, Object key)
用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)
2
public static boolean equals(long[] a, long[] a2)
如果两个指定的 long 型数组彼此相等,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)
3
public static void fill(int[] a, int val)
将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)
4
public static void sort(Object[] a)
对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)
表 数组常用方法
2.3 接口

接口是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。在本篇中不做详细介绍。
3.运算符

Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组:
3.1算术运算符

算数运算符除了最常见的加减乘除之外还有取余和自增自减,详细看下表
操作符
描述
例子(A=20,B=40)
+
加法 - 相加运算符两侧的值
A + B 等于60
-
减法 - 左操作数减去右操作数
A – B 等于 -20
*
乘法 - 相乘操作符两侧的值
A * B等于800
/
除法 - 左操作数除以右操作数
B / A等于2
取余 - 左操作数除以右操作数的余数
B%A等于0
++
自增: 操作数的值增加1
B++ 或 ++B 等于 41
--
自减: 操作数的值减少1
B-- 或 --B 等于 39
表 算数运算符
注:++i和- -i是先进行自增或自减,再表达式运算,i++和i--是先表达式运算,再自增或者自减
3.2关系运算符

关系运算符包括大于,大于等于,等于,小于等于,小于,不等于等6中运算符,详细见下表
运算符
描述
例子(A=20,B=40)
==
检查如果两个操作数的值是否相等,如果相等则条件为真。
(A == B)为假。
!=
检查如果两个操作数的值是否相等,如果值不相等则条件为真。
(A != B) 为真。
检查左操作数的值是否大于右操作数的值,如果是那么条件为真。
(A> B)为假。
检查左操作数的值是否小于右操作数的值,如果是那么条件为真。
(A <B)为真。
>=
检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。
(A> = B)为假。
<=
检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。
(A <= B)为真。
表 关系运算符
3.3位运算符

Java的位运算符应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。位运算符作用在所有的位上,并且按位运算。但在Java  web的代码审计项目中用到此运算符的比较少见。下表是位运算符的详情:
操作符
描述
例子( A 的值为 60 和变量 B 的值为 13)
如果相对应位都是1,则结果为1,否则为0
(A&B),得到12,即0000 1100
|
如果相对应位都是 0,则结果为 0,否则为 1
(A | B)得到61,即 0011 1101
^
如果相对应位值相同,则结果为0,否则为1
(A ^ B)得到49,即 0011 0001
按位取反运算符翻转操作数的每一位,即0变成1,1变成0
(〜A)得到-61,即1100 0011
<< 
按位左移运算符。左操作数按位左移右操作数指定的位数
A << 2得到240,即 1111 0000
>> 
按位右移运算符。左操作数按位右移右操作数指定的位数
A >> 2得到15即 1111
>>> 
按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充
A>>>2得到15即0000 1111
表 位运算符
3.4逻辑运算符

逻辑运算符(且或非)在if语句中很常见,这个需要重点关注
操作符
描述
例子(假设布尔变量A为真,变量B为假)
&&
称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真
(A && B)为假。
| |
称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真
(A | | B)为真。
称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false
!(A && B)为真。
表 逻辑运算符
3.5赋值运算符

下表是Java语言支持的赋值运算符,在代码审计中前五种是非常常见的。
操作符
描述
例子
=
简单的赋值运算符,将右操作数的值赋给左侧操作数
C = A + B将把A + B得到的值赋给C
+ =
加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数
C + = A等价于C = C + A
- =
减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数
C - = A等价于C = C - A
* =
乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数
C * = A等价于C = C * A
/ =
除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数
C / = A,C 与 A 同类型时等价于 C = C / A
(%)=
取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数
C%= A等价于C = C%A
<< =
左移位赋值运算符
C << = 2等价于C = C << 2
>> =
右移位赋值运算符
C >> = 2等价于C = C >> 2
&=
按位与赋值运算符
C&= 2等价于C = C&2
^ =
按位异或赋值操作符
C ^ = 2等价于C = C ^ 2
| =
按位或赋值操作符
C | = 2等价于C = C | 2
表 赋值运算符
3.6条件运算符(?:)

条件运算符也被称为三元运算符和三目运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。其格式如下:
type x = (expression) ? valueA : valueB
当expression条件为真时x=valueA,当expression条件为假时x=valueB
4.流程控制

流程控制一般分为条件结构和循环结构,想要在代码审计中挖掘 逻辑漏洞
4.1条件结构

if...else语句
if 语句后面可以跟 else 语句,当 if 语句的布尔表达式值为 true时,执行if语句块,当 if 语句的布尔表达式值为 false 时,else 语句块会被执行。其结构一般如下:
if(布尔表达式){
//如果布尔表达式的值为true
}else{
//如果布尔表达式的值为false
}
if...else if...else 语句
if 语句后面可以跟 else if…else 语句,这种语句可以检测到多种可能的情况。其结构一般如下:
if(布尔表达式 1){
//如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
//如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
//如果布尔表达式 3的值为true执行代码
}else {
//如果以上布尔表达式都不为true执行代码
}
注:使用 if,else if,else 语句的时候,需要注意下面几点:
  • if 语句至多有 1 个 else 语句,else 语句在所有的 else if 语句之后。
  • if 语句可以有若干个 else if 语句,它们必须在 else 语句之前。
  • 一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行。
嵌套的 if…else 语句
使用嵌套的 if…else 语句是合法的。也就是说你可以在另一个 if 或者 else if 语句中使用 if 或者 else if 语句。其结构一般如下:
if(布尔表达式 1){
////如果布尔表达式 1的值为true执行代码
if(布尔表达式 2){
////如果布尔表达式 2的值为true执行代码
}else{
////如果布尔表达式 2的值为false执行代码
}
}else{
////如果布尔表达式 1的值为false执行代码
}
switch case 语句
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。可以有任意数量的case语句,当expression的值为那个case就执行那个case的代码
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选

default : //可选
//语句
}

switch case 语句有如下规则:
  • switch 语句中的变量类型可以是:byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
  • switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。
  • case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
  • 当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。
  • 当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
  • switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。
4.2循环结构

while 循环
while是最基本的循环,它的结构为:
while( 布尔表达式 ) {
//循环内容
}
只要布尔表达式为 true,循环就会一直执行下去。
do…while 循环
对于 while 语句而言,如果不满足条件,则不能进入循环。但do…while 循环即使不满足条件,也至少会被执行一次。因此与while相比不同的是do…while 循环至少会执行一次。以下是do…while的结构
do {
//代码语句
}while(布尔表达式);
for循环
所有循环结构都可以用 while 或者 do...while表示,但for 循环比其他两个结构简单。for循环执行的次数是在执行前就确定的。常见结构如下:
for(初始化; 布尔表达式; 更新) {
//代码语句
}
关于 for 循环有以下几点说明:
  • 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
  • 然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
  • 执行一次循环后,更新循环控制变量。
  • 再次检测布尔表达式。循环执行上面的过程。
4.3关键字(break,continue,return)

break 关键字和continue 关键字
break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。break 跳出最里层的循环,并且继续执行该循环下面的语句。
continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。在 for 循环中,continue 语句使程序立即跳转到更新语句。在 while 或者 do…while 循环中程序立即跳转到布尔表达式的判断语句。
return关键字
return 语句可用于终止函数的执行或退出类的方法,并把控制权返回该方法的调用者。如果这个方法带有返回类型,return 语句就必须返回这个类型的值;如果这个方法没有返回值,可以使用没有表达式的 return 语句。return 语句的一般语法格式如下:
return 与方法相同类型的变量;
如果一个方法使用了 return 语句并且后面跟有该方法返回类型的值,那么调用此方法后,所得到的结果为该方法返回的值。

参考

[1] Java教程 | 菜鸟
https://www.runoob.com/java/java-tutorial.html
[2] Java教程- 廖雪峰的官方网站
https://www.liaoxuefeng.com/wiki/1252599548343744
[3] Java学习教程,Java基础教程(从入门到精通)
http://c.biancheng.net/java/
java 代码审计-语言基础篇

 

本文始发于微信公众号(安全宇宙):【创宇小课堂】java 代码审计-语言基础篇!万字干货,速度收藏!

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月18日22:59:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   java 代码审计-语言基础篇https://cn-sec.com/archives/539937.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息