JDK_Packages_java_lang

金风玉露一相逢,便胜却人间无数 ——秦观《鹊桥仙》

语言基础包,lang包含Base, AutoBoxing ,Utils, VM ,Throwble

注解、字节码增强、动态语言支持、反射、管理等

相关资料:

  • 虚拟机规范
  • JLS java language spec

java.lang

Provides classes that are fundamental to the design of the Java programming language.

提供Java编程语言设计的基础类。

Base

Provides classes that are fundamental to the design of the Java programming language. The most important classes are Object ,Class

提供Java编程语言设计的基础类。最重要的类是Object,它是类层次结构的根,类的实例表示运行时的类。

Class后续和ClassLoader一起分析

1 Byte = 8bit

1 Char = 2Byte

1 Integer = 4Byte

AutoBoxing

Frequently it is necessary to represent a value of primitive type as if it were an object. The wrapper classes Boolean, Character, Integer, Long, Float, and Double serve this purpose. An object of type Double, for example, contains a field whose type is double, representing that value in such a way that a reference to it can be stored in a variable of reference type. These classes also provide a number of methods for converting among primitive values, as well as supporting such standard methods as equals and hashCode. The Void class is a non-instantiable class that holds a reference to a Class object representing the type void.

通常有必要将基元类型的值表示为对象。包装器类Boolean、Character、Integer、Long、Float和Double用于此目的。例如,Double类型的对象包含一个类型为Double的字段,以一种引用可以存储在引用类型变量中的方式表示该值。这些类还提供了许多方法来在基本值之间进行转换,并支持equals和hashCode等标准方法。Void类是一个不可实例化的类,它持有对表示类型Void的类对象的引用。

注意IntegerCache

Utils (Math,String)

The class Math provides commonly used mathematical functions such as sine, cosine, and square root. The classes String, StringBuffer, and StringBuilder similarly provide commonly used operations on character strings.

Math & StrictMath

类Math提供常用的数学函数,如正弦、余弦和平方根。String、StringBuffer和StringBuilder类同样提供了对字符串的常用操作。

String & StringBuffer(synchronized) & StringBuilder

Stringcoding

regex

StringJoiner

Formatter

Locale

AbstractStringBuilder

String不可变性

  • 常量池
  • hashcode
  • 线程安全

https://zhuanlan.zhihu.com/p/94228628?utm_source=wechat_session&utm_medium=social&utm_oi=557574927448846336

⬅️⬅️⬅️⬅️⬅️

VM

Classes ClassLoader,Thread, Process, ProcessBuilder, Runtime, SecurityManager, and System provide “system operations” that manage the dynamic loading of classes, creation of external processes, host environment inquiries such as the time of day, and enforcement of security policies.

类ClassLoader、Process、ProcessBuilder、Runtime、SecurityManager和System提供“系统操作”,

管理类的动态加载、创建外部进程、主机环境查询(如一天的时间)和安全策略的执行。

Class & ClassLoader

link: JDK_CLass && JDK_ClassLoader

Process & Thread & Runnable

Process https://zhuanlan.zhihu.com/p/44957705

link: JDK_Thread

System

The SystemAmong the facilities provided by the System class are standard input, standard output, and error output streams; access to externally defined properties and environment variables; a means of loading files and libraries; and a utility method for quickly copying a portion of an array.

java.lang.System#initializeSystemClass

相关方法和类

​ SecurityManager

​ Runtime

​ Shutdown java.lang.System#exit

​ Process

​ ClassLoader java.lang.System#load

​ java.lang.System#gc

java.lang.System#currentTimeMillis

java.lang.System#nanoTime

java.lang.System#arraycopy

java.lang.System#getenv

java.lang.System#getProperties

Throwable

Class Throwable encompasses objects that may be thrown by the throw statement. Subclasses of Throwable represent errors and exceptions.

类可抛出性包含由抛出语句抛出的对象。Throwable的子类表示错误(Error)和异常(Exception 强制需要处理\ 运行时异常RuntimeException)。

通过一个JDK的例子来看看 Throwable的使用

public class Junk {
      public static void main(String args[]) {
          try {
              a();
          } catch(HighLevelException e) {
              e.printStackTrace();
          }
      }
      static void a() throws HighLevelException {
          try {
              b();
          } catch(MidLevelException e) {
              throw new HighLevelException(e);
          }
      }
      static void b() throws MidLevelException {
          c();
      }
      static void c() throws MidLevelException {
          try {
              d();
          } catch(LowLevelException e) {
              throw new MidLevelException(e);
          }
      }
      static void d() throws LowLevelException {
         e();
      }
      static void e() throws LowLevelException {
          throw new LowLevelException();
      }
  }
 
  class HighLevelException extends Exception {
      HighLevelException(Throwable cause) { super(cause); }
  }

  class MidLevelException extends Exception {
      MidLevelException(Throwable cause)  { super(cause); }
  }

  class LowLevelException extends Exception {
  }

运行结果如下

lang.Throwble.HighLevelException: lang.Throwble.MidLevelException: lang.Throwble.LowLevelException
     at lang.Throwble.Junk.a(Junk.java:15)
     at lang.Throwble.Junk.main(Junk.java:6)
Caused by: lang.Throwble.MidLevelException: lang.Throwble.LowLevelException
     at lang.Throwble.Junk.c(Junk.java:25)
     at lang.Throwble.Junk.b(Junk.java:19)
     at lang.Throwble.Junk.a(Junk.java:13)
     ... 1 more
Caused by: lang.Throwble.LowLevelException
     at lang.Throwble.Junk.e(Junk.java:32)
     at lang.Throwble.Junk.d(Junk.java:29)
     at lang.Throwble.Junk.c(Junk.java:23)
     ... 3 more

通过观察这个结果, 和分析 我们来看看Throwable都有哪些成员

private void printStackTrace(PrintStreamOrWriter s) {
    // Guard against malicious overrides of Throwable.equals by
    // using a Set with identity equality semantics.
    //  IdentityHashMap 比较的是地址值 int h = System.identityHashCode(x);
    Set<Throwable> dejaVu =
        Collections.newSetFromMap(new IdentityHashMap<Throwable, Boolean>());
    dejaVu.add(this);

    synchronized (s.lock()) {
        // Print our stack trace
        s.println(this);
        StackTraceElement[] trace = getOurStackTrace();
        for (StackTraceElement traceElement : trace)
            s.println("\tat " + traceElement);

        // Print suppressed exceptions, if any
        for (Throwable se : getSuppressed())
            se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION, "\t", dejaVu);

        // Print cause, if any
        Throwable ourCause = getCause();
        if (ourCause != null)
            ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, "", dejaVu);
    }
}

s.println(this);

public String toString() {
    String s = getClass().getName();
    String message = getLocalizedMessage();
    return (message != null) ? (s + ": " + message) : s;
}

可以看到其实就是

  • 类名加Message
  • 堆栈信息StackTraceElement
  • ourCause Caused by:上层异常

java.lang.annotation

Provides library support for the Java programming language annotation facility.

为Java编程语言注解工具提供库支持。

/*
 * More information about annotation types can be found in section 9.6 of
 * <cite>The Java&trade; Language Specification</cite>.
 */

注解(Annotation),也叫(metadata)元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。这些信息被存储在Annotation的“name=value”结构对中。

大致可分为三类:

  • 编写文档:通过代码里标识的元数据生成文档。

  • 代码分析:通过代码里标识的元数据对代码进行分析。

  • 编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查

内置注解

内置注解分为三类:

  • @Override
  • @Deprecated
  • @SuppressWarnings

元注解

元注解就是定义注解的注解,由 java API 提供,分别有四个元注解:

  • @Target

    用于描述注解的使用范围。修饰的对象范围:packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如 catch 参数)。

    它的值在枚举类 ElemenetType 中:

    • CONSTRUCTOR: 用于描述构造器
    • FIELD : 用于描述域
    • LOCAL_VARIABLE: 用于描述局部变量
    • METHOD : 用于描述方法
    • PACKAGE : 用于描述包
    • PARAMETER : 用于描述参数
    • TYPE : 用于描述类、接口(包括注解类型) 或enum声明
  • @Retention

    表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效),定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取。

    RetentionPoicy取值:

    • SOURCE : 在源文件中有效(即源文件保留)
    • CLASS : 在class文件中有效(即class保留)
    • RUNTIME : 在运行时有效(即运行时保留)
  • @Documented

    用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,Documented 是一个标记注解,没有成员。将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。

  • @Inherited

    允许子类继承父类中的注解,是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

@link : https://www.jianshu.com/p/d124f24e685c

java.lang.instrument

Provides services that allow Java programming language agents to instrument programs running on the JVM.

提供允许Java编程语言代理对运行在JVM上的程序进行增强的服务。

JPDA体系概览

  • JPDA 定义了一套如何开发调试工具的接口和规范。
  • JPDA 由三个独立的模块 JVMTI、JDWP、JDI 组成。
    • 调试者通过 JDI 发送接受调试命令。
    • JDWP 定义调试者和被调试者交流数据的格式。
    • JVMTI 可以控制当前虚拟机运行状态。

https://www.ibm.com/developerworks/cn/java/j-lo-jpda2/index.html?ca=drs-

https://www.cnblogs.com/yelao/p/9841810.html

class

java.lang.instrument.ClassFileTransformer

java.lang.instrument.Instrumentation

java.lang.instrument.ClassDefinition

java.lang.invoke

The java.lang.invoke package contains dynamic language support provided directly by the Java core class libraries and virtual machine.

包含Java核心类库和虚拟机直接提供的动态语言支持。

java7在JSR 292中增加了对动态类型语言的支持,使Java也可以像C语言那样将方法作为参数传递,其实现在lava.lang.invoke包中。MethodHandle作用类似于反射中的Method类,但它比Method类要更加灵活和轻量级。通过MethodHandle进行方法调用一般需要以下几步:

  1. 创建MethodType对象,指定方法的签名;
  2. 在MethodHandles.Lookup中查找类型为MethodType的MethodHandle;
  3. 传入方法参数并调用MethodHandle.invoke或者MethodHandle.invokeExact方法。

InvokeDynamic

https://www.cnblogs.com/sheeva/p/6344388.html

在看java虚拟机字节码执行引擎的时候,里面提到了java虚拟机里调用方法的字节码指令有5种:

  • invokestatic  //调用静态方法
  • invokespecial  //调用私有方法、实例构造器方法、父类方法
  • invokevirtual  //调用实例方法
  • invokeinterface  //调用接口方法,会在运行时再确定一个实现此接口的对象
  • invokedynamic  //先在运行时动态解析出调用点限定符所引用的方法,然后再执行该方法,在此之前的4条调用指令,分派逻辑是固化在java虚拟机内部的,而invokedynamic指令的分派逻辑是由用户所设定的引导方法决定的。

CallSite

从语言的静态类型和动态类型说起:

  • 静态类型就是每个变量在初始化的时候就要声明唯一的类型并且不能改变。
  • 动态类型就是说变量没有固定类型,变量的类型取决于它里面元素的类型。

java语言是静态类型的。有人可能会提到泛型,java的泛型是擦除式的,也就是说虽然在编写java源码时看起来好像不能确定变量类型,但是在java编译为字节码的过程中,每一个变量都是有确定的类型的。

所以从java语言的角度,之前的4条方法调用指令是完全够用的,但是要知道,jvm不只是跨平台的,还是跨语言的,当有人在jvm上试图开发动态类型语言的时候,问题就来了:

jvm大多数指令都是类型无关的,但是在方法调用的时候,却不是这样,每个方法调用在编译阶段就必须指明方法参数和返回值类型,但是动态类型语言的方法参数,直到运行时刻才能知道类型啊,因此jdk就做了这样一个“补丁”:用invokedynamic调用方法的时候,会转到bootstrap方法,在这个方法里可以动态获取参数类型,然后根据参数类型分派合适的方法作为CallSite(动态调用点),最后真实调用的就是CallSize里的方法。如此便能在jvm上实现动态类型语言的方法调用了。

java.lang.management

Provides the management interfaces for monitoring and management of the Java virtual machine and other components in the Java runtime.

提供用于监视和管理Java虚拟机和Java运行时中的其他组件的管理接口。

JMX Instrumentation Specification

访问MXBeans的方法

1.直接访问MXBean接口

2.通过MBeanServer间接访问MXBean接口

jmx规范

https://docs.oracle.com/javase/8/docs/api/javax/management/package-summary.html

ManagementFactory

实现-> sum包中 ? 😪

java.lang.ref

Provides reference-object classes, which support a limited degree of interaction with the garbage collector.

提供引用对象类,该类支持与垃圾收集器进行有限程度的交互。

表 1. 引用类型特性总结

引用类型 取得目标对象方式 垃圾回收条件 是否可能内存泄漏
强引用 直接调用 不回收 可能
软引用 通过 get() 方法 视内存情况回收 不可能
弱引用 通过 get() 方法 永远回收 不可能
虚引用 无法取得 不回收 可能

表 2:各个引用在 GC 后是否被回收?

类型 GC 后是否回收 示例代码 运行结果
StrongReference 不回收 见清单 3 name:10
SoftReference 不回收 见清单 4 name:10
WeakReference 回收 见清单 5 name:10
PhantomReference N/A N/A N/A

https://www.cnblogs.com/rollenholt/archive/2011/09/21/2183077.html

java.lang.reflect

Provides classes and interfaces for obtaining reflective information about classes and objects.

提供用于获取有关类和对象的反射信息的类和接口。

Construct、Field、Method

Fastjson

Proxy

https://www.cnblogs.com/xrq730/p/4918762.html


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 951488791@qq.com

文章标题:JDK_Packages_java_lang

字数:3.2k

本文作者:zhengyumin

发布时间:2019-08-11, 19:04:56

最后更新:2020-04-10, 15:42:57

原始链接:http://zyumin.github.io/2019/08/11/JDK-Packages-java-lang/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。