Java-API简析_java.io.FilePermission类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://blog.csdn.net/m0_69908381/article/details/132594530
出自【进步*于辰的博客】

因为我发现目前,我对Java-API的学习意识比较薄弱,需要慢慢习惯使用Java-API,乃至剖析源码来提升自己的源码阅读能力和编码素质。
大家如果需要Java-API文档,我上传了【https://download.csdn.net/download/m0_69908381/87691693】。

文章目录

  • 1、概述
  • 2、构造方法摘要
    • 2.1 String path, String actions
  • 3、方法摘要
    • 3.1 boolean equals(Object obj)
    • 3.2 String getActions()
    • 3.3 int hashCode()
    • 3.4 boolean implies(Permission p)
    • 3.5 PermissionCollection newPermissionCollection()
  • 4、方法摘要(不开放)
    • 4.1 private static int getMask(String actions)
    • 4.2 private void init(int mask)
  • 5、字段摘要
    • 5.1 操作列表

1、概述

继承关系:

  • java.lang.Object
    • java.security.Permission
      • java.io.FilePermission

所有已实现的接口:
Serializable、Guard


public final class FilePermission extends Permission implements Serializable

此类表示对文件和目录的访问。FilePermission 由文件名对该路径名有效的操作集合 组成。

路径名是授予指定操作的文件或目录的路径名。以 “/*”(其中 “/” 是文件分隔符字符,即 File.separatorChar)结尾的路径名指示包含在该目录中的所有文件目录。以 “/-” 结尾的路径名(递归地)指示包含在该目录中的所有文件子目录。由特殊标记 “<>” 组成的路径名可匹配任何文件。

注:由单个 “*” 组成的路径名指示当前目录中的所有文件,而由单个 “-” 组成的路径名指示当前目录中的所有文件,并(递归地)指示包含在当前目录中的所有文件子目录

将所要授予的操作以字符串的形式传递给构造方法,该字符串包含由一个或多个用逗号分隔的关键字组成的列表。可能的关键字有 “read”、“write”、“execute” 和 “delete”。其含义定义如下:

read
读权限
write
写权限
execute
执行权限。允许调用 Runtime.exec()。对应于 SecurityManager.checkExec()
delete
删除权限。允许调用 File.delete()。对应于 SecurityManager.checkDelete()

处理前会将操作字符串转换为小写字母

在授予 FilePermission 权限时要小心。在对各种文件和目录授予读访问权和(尤其是)写访问权时,一定要慎重。对写操作授予 “<>” 权限特别危险。这允许对整个文件系统进行写操作。事实上它甚至允许对系统中的二进制文件(包括 JVM 运行时环境)进行替换。

请注意:代码总是可以读取自身所在目录(或该目录的子目录)中的文件,不需要对其进行显式授权。

从以下版本开始:
1.2
另请参见:
Permission、Permissions、PermissionCollection

2、构造方法摘要

2.1 String path, String actions

创建具有指定操作的新 FilePermission 对象,path 是文件或目录的路径名,actions 包含对文件或目录授予的所需操作的列表,该列表由逗号分隔。
说明:
先看源码。
在这里插入图片描述
关于getMask(),见第4.1项;关于init(),见第4.2项。

3、方法摘要

3.1 boolean equals(Object obj)

检查两个 FilePermission 对象是否相等。

3.2 String getActions()

返回操作的“规范化字符串表示形式”。

3.3 int hashCode()

返回此对象的哈希码值。

3.4 boolean implies(Permission p)

检查 FilePermission 对象是否“隐含”指定的权限。

3.5 PermissionCollection newPermissionCollection()

返回用于存储 FilePermission 对象的新 PermissionCollection 对象。

4、方法摘要(不开放)

4.1 private static int getMask(String actions)

将操作字符串转换为操作掩码。
说明:
先看源码。
Java-API简析_java.io.FilePermission类(基于 Latest JDK)(浅析源码)_第1张图片
源码看起来比较复杂,其根本是一个判断和解析字符串的过程,其与SocketPermission类的第4.2项,在逻辑上很相似。

4.2 private void init(int mask)

初始化。
说明:
先看源码。
Java-API简析_java.io.FilePermission类(基于 Latest JDK)(浅析源码)_第2张图片
解析第一行的(mask & ALL) != mask
位运算&表示:当两者都为1时,结果才为1。从第5.1可知,ALL31,其二进制是0001 1111。因此,若要满足(mask & ALL) == mask,只需要mask <= 31即可,即0x0 <= mask <= 0x1f
从上1项可知,mask是操作掩码,而操作掩码对应的是操作列表,故可假设:mask对应操作列表中的操作时才有效。

后续补充解析。

5、字段摘要

5.1 操作列表

包含此权限类可授予权限的操作列表。
说明:
先看源码。
Java-API简析_java.io.FilePermission类(基于 Latest JDK)(浅析源码)_第3张图片
这些操作都使用十六进制表示,为了便于理解和位运算(ALL = READ|WRITE|EXECUTE|DELETE|READLINK),需要先将其转换成二进制。

如果大家对图中二进制与十六进制间转换以及位运算有所疑惑,可参考博文【关于对【8位二进制的整数表示范围、常见位运算符和进制间转换】的理解与简述】。

当然,就这些字段值的特殊性,ALL的计算也不需要先转成二进制。什么特殊性?即 2x。也就是说,当使用二进制表示它们时,8位二进制中,只有一个是1。再看ALL所需的5个字段,没有值相同的,故这5个1都分布在不同位上。因此,ALL的结果就是0001 1111(位运算|表示:只要有一个是1,则结果为1ALL得到那5个1),得3131 = 1 + 2 + 4 + 8 + 16)。

总结:在一定条件下,位运算|与和+结果相同。


本文暂缓更新。

你可能感兴趣的:(Java-API,Java-API简析,FilePermission)