java.lang → Boolean

是什么

Boolean 类是将 boolean 基本类型进行包装。类型为 Boolean 的对象包含一个单一属性 value,其类型为 boolean。
此外还提供了许多将 boolean 转换为 String、String 转换为 boolean,以及其他一些方法。

构造器

有两个构造器

  1. public Class Boolean {
  2. public static final Boolean TRUE = new Boolean(true);
  3. public static final Boolean FALSE = new Boolean(false);
  4. public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass("boolean");
  5. private final boolean value;
  6. public Boolean(boolean value) {
  7. this.value = value;
  8. }
  9. public Boolean(String s) {
  10. this(parseBoolean(s));
  11. }
  12. }

我们可以看到在内部维护了一个 boolean 类型的 value,在我们调用构造器的时候会将 value 给赋值。

还可以看到内部还有三个常量其中两个是 TRUE、FALSE 分别代表布尔值的两个状态,这样我们在使用的时候就可以直接用而不需要去构建一个。

还有一个 TYPE 是接收了 Class.getPrimitiveClass("boolean"); 的返回值,我们跟进去可以看到 getPrimitiveClass 是一个 native 方法。

  1. static native Class<?> getPrimitiveClass(String name);

我们直接查看 openJDK 中对应的 Class.c 文件可以发现对应的方法 Java_java_lang_Class_getPrimitiveClass

  1. JNIEXPORT jclass JNICALL
  2. Java_java_lang_Class_getPrimitiveClass(JNIEnv *env,
  3. jclass cls,
  4. jstring name)
  5. {
  6. const char *utfName;
  7. jclass result;
  8. if (name == NULL) {
  9. JNU_ThrowNullPointerException(env, 0);
  10. return NULL;
  11. }
  12. utfName = (*env)->GetStringUTFChars(env, name, 0);
  13. if (utfName == 0)
  14. return NULL;
  15. result = JVM_FindPrimitiveClass(env, utfName);
  16. (*env)->ReleaseStringUTFChars(env, name, utfName);
  17. return result;
  18. }

我们可以看到 JVM 会根据我们传递的 "boolean" name 字符串来调用 JVM_FindPrimitiveClass 来获取到 jclass,返回到 java 层则为 Class.

并且如果常量 TYPE 在执行到 toString() 时还是会调用到 native 方法。如下

  1. public String toString() {
  2. return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
  3. + getName();
  4. }
  5. public String getName() {
  6. String name = this.name;
  7. if (name == null)
  8. // 会调用到 getName0();
  9. this.name = name = getName0();
  10. return name;
  11. }
  12. private native String getName0();

我们会发现最终会调用到 getName0() 这个 native 方法。所以我们继续去看 C 文件

  1. static JNINativeMethod methods[] = {
  2. {"getName0", "()" STR, (void *)&JVM_GetClassName},
  3. {"getSuperclass", "()" CLS, NULL},
  4. {"getInterfaces0", "()[" CLS, (void *)&JVM_GetClassInterfaces},
  5. {"getClassLoader0", "()" JCL, (void *)&JVM_GetClassLoader},
  6. {"isInterface", "()Z", (void *)&JVM_IsInterface},
  7. {"getSigners", "()[" OBJ, (void *)&JVM_GetClassSigners},
  8. {"setSigners", "([" OBJ ")V", (void *)&JVM_SetClassSigners},
  9. {"isArray", "()Z", (void *)&JVM_IsArrayClass},
  10. {"isPrimitive", "()Z", (void *)&JVM_IsPrimitiveClass},
  11. {"getComponentType", "()" CLS, (void *)&JVM_GetComponentType},
  12. {"getModifiers", "()I", (void *)&JVM_GetClassModifiers},
  13. {"getDeclaredFields0","(Z)[" FLD, (void *)&JVM_GetClassDeclaredFields},
  14. {"getDeclaredMethods0","(Z)[" MHD, (void *)&JVM_GetClassDeclaredMethods},
  15. {"getDeclaredConstructors0","(Z)[" CTR, (void *)&JVM_GetClassDeclaredConstructors},
  16. {"getProtectionDomain0", "()" PD, (void *)&JVM_GetProtectionDomain},
  17. {"getDeclaredClasses0", "()[" CLS, (void *)&JVM_GetDeclaredClasses},
  18. {"getDeclaringClass0", "()" CLS, (void *)&JVM_GetDeclaringClass},
  19. {"getGenericSignature0", "()" STR, (void *)&JVM_GetClassSignature},
  20. {"getRawAnnotations", "()" BA, (void *)&JVM_GetClassAnnotations},
  21. {"getConstantPool", "()" CPL, (void *)&JVM_GetClassConstantPool},
  22. {"desiredAssertionStatus0","("CLS")Z",(void *)&JVM_DesiredAssertionStatus},
  23. {"getEnclosingMethod0", "()[" OBJ, (void *)&JVM_GetEnclosingMethodInfo},
  24. {"getRawTypeAnnotations", "()" BA, (void *)&JVM_GetClassTypeAnnotations},
  25. };

我们可以看到这个数组的第一行 getName0 就被定义为了 JVM_GetClassName 的函数。大家还记得当时 Object 文章里类似的地方吗,是的没错 Class 类中也有 registerNatives 的本地方法来注册对应的方法。

  1. public final class Class<T> implements java.io.Serializable,GenericDeclaration,Type,
  2. AnnotatedElement {
  3. private static native void registerNatives();
  4. static {
  5. registerNatives();
  6. }
  7. }

好了我们继续来看 getName0 被定义为对应的 JVM_GetClassName 函数后。最终的 JVM_GetClassName 实现函数是下面展示的.

  1. JVM_ENTRY(jstring, JVM_GetClassName(JNIEnv *env, jclass cls))
  2. assert (cls != NULL, "illegal class");
  3. JVMWrapper("JVM_GetClassName");
  4. JvmtiVMObjectAllocEventCollector oam;
  5. ResourceMark rm(THREAD);
  6. const char* name;
  7. if (java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
  8. // 注意这一行函数里会去 type2name_tab 数组里去寻找
  9. name = type2name(java_lang_Class::primitive_type(JNIHandles::resolve(cls)));
  10. } else {
  11. // Consider caching interned string in Klass
  12. Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
  13. assert(k->is_klass(), "just checking");
  14. name = k->external_name();
  15. }
  16. oop result = StringTable::intern((char*) name, CHECK_NULL);
  17. return (jstring) JNIHandles::make_local(env, result);
  18. JVM_END

我们可以看到第八行会去调用 type2name 函数,最终根据一个数组获得对应的名称,比如这里下标为4,则名称为”boolean”。

  1. const char* type2name_tab[T_CONFLICT+1] = {
  2. NULL, NULL, NULL, NULL,
  3. "boolean",
  4. "char",
  5. "float",
  6. "double",
  7. "byte",
  8. "short",
  9. "int",
  10. "long",
  11. "object",
  12. "array",
  13. "void",
  14. "*address*",
  15. "*narrowoop*",
  16. "*conflict*"
  17. };

重要方法

parseBoolean

  1. public static boolean parseBoolean(String s) {
  2. // 判断参数 s 是否不为空并且是 "true" 字符串
  3. return ((s != null) && s.equalsIgnoreCase("true"));
  4. }

valueOf

  1. public static Boolean valueOf(boolean b) {
  2. // 三目表达式没什么好说的
  3. return (b ? TRUE : FALSE);
  4. }

toString

  1. public static String toString(boolean b) {
  2. // 三目表达式没什么好说的
  3. return b ? "true" : "false";
  4. }
  5. public String toString() {
  6. return value ? "true" : "false";
  7. }

hashCode

  1. public static int hashCode(boolean value) {
  2. // 即 true 返回 1231 而 false 返回 1237
  3. return value ? 1231 : 1237;
  4. }

equals

  1. public boolean equals(Object obj) {
  2. // 方法就是先判断是不是从 Boolean 实例化出来的,然后再继续比较是不是相等。
  3. if (obj instanceof Boolean) {
  4. return value == ((Boolean)obj).booleanValue();
  5. }
  6. return false;
  7. }

getBoolean

  1. public static boolean getBoolean(String name) {
  2. boolean result = false;
  3. try {
  4. // 从系统环境中获取指定 name 如果失败则返回 false
  5. result = parseBoolean(System.getProperty(name));
  6. } catch (IllegalArgumentException | NullPointerException e) {
  7. }
  8. return result;
  9. }

compareTo

  1. public int compareTo(Boolean b) {
  2. return compare(this.value, b.value);
  3. }
  4. public static int compare(boolean x, boolean y) {
  5. // 如果 boolean 相等则返回 0 否则 x 为真返回 1 为假返回 -1
  6. return (x == y) ? 0 : (x ? 1 : -1);
  7. }

逻辑运算

  1. public static boolean logicalAnd(boolean a, boolean b) {
  2. return a && b;
  3. }
  4. public static boolean logicalOr(boolean a, boolean b) {
  5. return a || b;
  6. }
  7. public static boolean logicalXor(boolean a, boolean b) {
  8. return a ^ b;
  9. }

上面三个方法也没啥好说的大家自己看。

java.lang -> Boolean的更多相关文章

  1. JDK1.7.0_45源码阅读<java.lang.Boolean>

    本文适合的人群 其实感觉写这个标题的内容没有必要,只要你觉得对你有帮助那么就适合你,对你没帮助那么就不适合你.毕竟我不是专业作者,但咱会尽力的.其实最重要的一点是我不希望浪费您宝贵时间. 简要把内容在 ...

  2. java.lang.Boolean为null时

    public class TestBooleanNull { public static void main(String[] args) { if (test()) { System.out.pri ...

  3. Cannot convert 0 of type class java.lang.Integer to class java.lang.Boolean

    org.apache.catalina.core.ApplicationDispatcher invoke SEVERE: Servlet.service() for servlet jsp thre ...

  4. java.lang.Boolean 类源码解析

    Boolean源码比较简单. public final class Boolean implements java.io.Serializable, Comparable<Boolean> ...

  5. jdk源码分析——java.lang.Boolean

      1.Boolean类里面的2个静态变量. Boolean类,直接声明了2个静态变量,TRUE 和 FALSE,指向2个对象.     public static final Boolean TRU ...

  6. java.lang.Boolean.compareTo()方法实例

    compareTo接口 Comparable<Boolean>指定以下接口 参数 b - 布尔实例进行比较 返回值 方法返回 0 - 如果该对象表示相同的布尔值作为参数 一个正数值 - 如 ...

  7. Unknown return value type [java.lang.Boolean]] with root cause

    添加@responsebody 为什么呢 ? 因为在进行ajax传输的时候  我已指定传输的类型为 json数据类型 要是不加的话 它只是Boolean类型 而不是json类型

  8. java.lang.Boolean.valueOf(String s)

    简单说,就是s为true(这四个字母大小写任意)时,返回值为true,否则为false public class one { public static void main(String[] args ...

  9. java.lang基础数据类型boolean、char、byte、short、int、long、float、double (JDK1.8)

    java.lang.Boolean public static int hashCode(boolean value) { return value ? 1231 : 1237; } JDK 1.8新 ...

随机推荐

  1. Matplotlib基础使用

    matplotlib 一.Matplotlib基础知识 Matplotlib中的基本图表包括的元素 x轴和y轴 axis 水平和垂直的轴线 x轴和y轴刻度 tick 刻度标示坐标轴的分隔,包括最小刻度 ...

  2. Python自学第二天学习之《列表》

    一.  列表:list类型,是有序的,可以被修改的. 格式 : li=["cd",1,"gfds",[1,2,3]] 1.类型转换: #字符串转换成列表 b=“ ...

  3. python学习第二十七天函数的return返回值

    python函数返回值用的return ,函数遇到return 结束函数运行过程,终止程序,不论后面还有多少个输出,都终止本次函数,所有一定要慎重用return 1,函数return用法 def go ...

  4. JS中的reduce函数

    海纳百川,有容乃大 定义: reduce()方法接受一个函数作为累加器,数组中的每个值(从左向右)开始缩减,最终计算为一个值.对空数组是不会执行回调函数的. 案例: 计算数组总和: var num = ...

  5. js利用递归与promise 按顺序请求数据

    问题:项目中有一个需求,一个tabBar下面如果没有内容就不让该tabBar显示,当然至于有没有内容,需要我们通过请求的来判断,但是由于请求是异步的,如何让请求按照tabBar的顺序进行? 方案:我们 ...

  6. 形象生动的SpringBoot和SpringMVC的区别

    spring boot只是一个配置工具,整合工具,辅助工具. springmvc是框架,项目中实际运行的代码 Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等 ...

  7. 268-基于FMC接口的DSP TMS320C6657子卡模块

    基于FMC接口的DSP TMS320C6657子卡模块 一. 概述         FMC连接器是一种高速多pin的互连器件,广泛应用于板卡对接的设备中,特别是在xilinx公司的所有开发板中都使用. ...

  8. 任务管理器taskmgr查看几核

  9. Es学习第十课,ElasticSearch集群搭建

    前面几课我们已经把ES的基本概念和查询了解了,大家知道ES的核心优势就是天生支持分布式,所以,这课我们专门讲讲怎么搭建实现ES的集群部署. ES分布式原理 1.es分布式概念 主分片(Primary ...

  10. C#高级编程笔记(17至21章节)线程/任务

    17 Visual Studio 2013 控制台用Ctrl+F5可以显示窗口,不用加Console.ReadLine(); F5用于断点调式 程式应该使用发布,因为发布的程序在发布时会进行优化, 2 ...