Java.Lang.Boolean源码

本文深入解析Java中的Boolean类,涵盖其成员变量、构造方法、成员方法如toString、hashCode、compareTo等,以及逻辑运算方法。同时介绍了如何使用valueOf方法提高空间和时间性能。

package java.lang

  • @since JDK1.0

public final class Boolean implements java.io.Serializable, Comparable< Boolean>

成员变量

public static final Boolean TRUE = new Boolean(true)

public static final Boolean FALSE = new Boolean(false)

private final boolean value

构造方法

public Boolean(boolean value)

    public Boolean(boolean value) {
        this.value = value;
    }

public Boolean(String s)

字符串s忽略大小写后与“true”相等,则返回(Boolean)true

    public Boolean(String s) {
        this(parseBoolean(s));
    }

    public static boolean parseBoolean(String s) {
        return ((s != null) && s.equalsIgnoreCase("true"));
    }

    public boolean booleanValue() {
        return value;
    }

成员方法

官方推荐方式valueOf() for “significantly better space and time performance”

     * If a new {@code Boolean} instance is not required, this method
     * should generally be used in preference to the constructor
     * {@link #Boolean(boolean)}, as this method is likely to yield
     * significantly better space and time performance.

    public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }

    public static Boolean valueOf(String s) {
        return parseBoolean(s) ? TRUE : FALSE;
    }

    public static String toString(boolean b) {
        return b ? "true" : "false";
    }

toString

    public String toString() {
        return value ? "true" : "false";
    }

    @Override
    public int hashCode() {
        return Boolean.hashCode(value);
    }

hashCode

    public static int hashCode(boolean value) {
        return value ? 1231 : 1237;
    }

    public boolean equals(Object obj) {
        if (obj instanceof Boolean) {
            return value == ((Boolean)obj).booleanValue();
        }
        return false;
    }

getBoolean

获取系统属性

    public static boolean getBoolean(String name) {
        boolean result = false;
        try {
            result = parseBoolean(System.getProperty(name));
        } catch (IllegalArgumentException | NullPointerException e) {
        }
        return result;
    }

compareTo

相同为0,this.value为true返回1,b.value为true返回-1

    public int compareTo(Boolean b) {
        return compare(this.value, b.value);
    }

    public static int compare(boolean x, boolean y) {
        return (x == y) ? 0 : (x ? 1 : -1);
    }

逻辑运算

    public static boolean logicalAnd(boolean a, boolean b) {
        return a && b;
    }

    public static boolean logicalOr(boolean a, boolean b) {
        return a || b;
    }

    public static boolean logicalXor(boolean a, boolean b) {
        return a ^ b;
    }
### 解决 `java.lang.reflect.InaccessibleObjectException` 错误的方法 #### 1. **问题背景** 当尝试通过反射访问某些私有字段或方法时,可能会遇到 `java.lang.reflect.InaccessibleObjectException`。这种错误通常发生在使用高版本 JDK(如 JDK 9 及以上)的情况下,因为这些版本引入了模块化系统(Project Jigsaw),增强了类和包之间的封装性[^2]。 具体来说,`Unable to make private native java.lang.Class.getDeclaredFields0(boolean)` 表明程序试图通过反射访问 `getDeclaredFields0` 方法,但由于模块 `java.base` 并未向未命名模块开放 `java.lang` 包,因此引发了此异常[^3]。 --- #### 2. **解决方法** ##### 方法一:调整 JVM 启动参数 最常用的解决方案是通过在 JVM 启动选项中添加 `--add-opens` 参数来解决问题。例如: ```bash --add-opens java.base/java.lang=ALL-UNNAMED ``` 这条命令的作用是强制允许未命名模块访问 `java.base` 模块中的 `java.lang` 包。如果需要访问其他受限制的包,可以根据实际情况扩展该参数[^5]。 ##### 方法二:升级或适配依赖库 如果问题是由于第三方库引起的,建议检查是否有更新版本的库支持最新的 JDK 版本。许多旧版框架可能不兼容高版本 JDK 的模块化特性,因此升级到最新版本可能是必要的[^4]。 ##### 方法三:修改代码逻辑 如果可以控制源码,应尽量避免直接使用反射访问私有字段或方法。可以通过以下几种方式重构代码: - 使用公共 API 替代反射操作。 - 修改目标类的设计,使其提供公开的 getter/setter 方法或其他接口供外部调用。 - 如果确实需要动态行为,可以考虑使用代理模式或事件驱动机制替代反射[^1]。 --- #### 3. **示例代码** 假设有一个场景需要通过反射访问某个类的私有字段,但在高版本 JDK 上遇到了 `InaccessibleObjectException`。以下是具体的解决方案示例: ##### 场景描述 定义了一个简单的类 `Item`,其中包含一个私有静态字段 `v`: ```java // Item.java package com.jdojo.reflect; public class Item { private static final int v = 42; } ``` 尝试通过反射访问这个字段会引发异常: ```java // Main.java import java.lang.reflect.Field; public class Main { public static void main(String[] args) throws Exception { Field field = Item.class.getDeclaredField("v"); field.setAccessible(true); System.out.println(field.getInt(null)); // 访问静态字段 } } ``` ##### 解决方案 为了使上述代码正常运行,可以在启动 JVM 时添加以下参数: ```bash java --add-opens java.base/java.lang=ALL-UNNAMED Main ``` 这样就可以成功打印出字段值 `42`。 --- #### 4. **注意事项** - 调整 JVM 参数是一种临时解决方案,长期来看仍需逐步迁移至更现代的技术栈。 - 在生产环境中随意打开模块权限可能存在安全隐患,因此应在必要时谨慎使用 `--add-opens` 参数。 - 如果项目涉及多个模块间的交互,建议仔细阅读相关模块的文档,确保所有依赖关系清晰明确。 --- ### 示例代码片段 以下是如何在 Maven 或 Gradle 项目中配置 JVM 参数的例子: #### Maven 配置 在 `pom.xml` 文件中添加以下内容: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.x.x</version> <configuration> <argLine>--add-opens java.base/java.lang=ALL-UNNAMED</argLine> </configuration> </plugin> </plugins> </build> ``` #### Gradle 配置 在 `build.gradle` 文件中添加以下内容: ```groovy tasks.withType(JavaExec) { jvmArgs '--add-opens', 'java.base/java.lang=ALL-UNNAMED' } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值