今天在看深入Java虚拟机的class文件结构时,看到了这么一句话,
可能出现在class文件中的两种编译器产生的方法是:实例初始化方法(名为<init>)和类与接口初始化方法(名为<clinit>)。
这两种方法有什么区别呢?
首先:这两个方法一个是虚拟机在装载一个类初始化的时候调用的(clinit)。另一个是在类实例化时调用的(init)
首先说说类的初始化:
在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化语句给出的。一个类变量初始化语句是
变量声明后的等号和表达式:
class Example {
static int size = 3 * (int) (Math.random() * 5.0);
}
静态初始化语句是一个以static开头的语句块:
class Example{
static int size;
static {
size = 3 * (int) (Math.random() * 5.0);
}
}
所有的类变量初始化语句和类型的静态初始化语句都被Java编译器收集到了一起,放在一个特殊的方法中。这个方法就是<clinit>
我们在来看看<init>这个方法:
<init>方法是在一个类进行对象实例化时调用的。实例化一个类有四种途径:调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。
Java编译器会为它的每一个类都至少生成一个实例初始化方法。在Class文件中,被称为"<init>"
现在知道了吧, 一个是用于初始化静态的类变量, 一个是初始化实例变量!
分享到:
相关推荐
在上述代码示例中,`debug.MyTest`类中的静态变量`i`除以0导致`ArithmeticException`,异常信息显示在`<clinit>`方法中,这证实了`<clinit>`与类的静态初始化有关。 对象初始化方法:<init> `<init>`方法则是用于...
这里有两个方法:一个构造器`<init>`和静态初始化方法`<clinit>`。使用`cw.visitMethod()`生成方法的访问者对象`MethodVisitor`,然后通过访问者对象的方法来构建字节码。 对于构造器`<init>`,我们通常会调用超类...
at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.<clinit>(PackagePropertiesMarshaller.java:41) at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:161) ...
JVM 中 init 和 clinit 的区别详解 Java 虚拟机(JVM)是 Java 语言的核心组件之一,负责将 Java 字节码转换为机器码并执行。其中,init 和 clinit 是两个重要的概念,它们分别是实例构造器和类构造器,在 Java ...
at MsWordEdit.<init>(MsWordEdit.java:25) at MsWordEdit.main(MsWordEdit.java:642) 如果不清楚java.library.path,输出一下即可。代码如下 System.out.println(System.getProperty("java.library.path"));
JVM会在类加载时生成一个名为<clinit>()的特殊方法,用于聚合这些静态初始化操作,<clinit>()方法只执行一次。 接下来是实例初始化,也就是当我们创建一个新的对象时发生的过程: 1. 分配内存:为新对象分配内存...
- **代码质量**:由于反编译过程中可能会丢失部分元数据,生成的源代码可能与原始代码有所差异,例如方法名可能变为默认的`<init>`和`<clinit>`,变量名可能变为`arg0`、`arg1`等。 - **版权问题**:在商业项目中,...
其中,初始化阶段是执行类的初始化方法<clinit>()的时刻,它包含了类的所有静态变量的初始化和静态代码块的执行。 接着,让我们关注实例初始化。每当创建一个新对象时,都会执行实例初始化。这部分代码通常在构造...
- `stop on com.baidu.mobads.remote.JsInterface.<init>()` - `stop on com.baidu.mobads.remote.JsInterface.watchTemperature(java.lang.String)` - `stop on android.webkit.WebViewCore.loadUrl` - 将这些...
- **注意**:`<clinit>`方法不是类的构造器,它是字节码文件中的一种特殊方法,只能被JVM识别。 #### 虚拟机栈生命周期 1. **栈的生命周期**:虚拟机栈的生命周期与线程的生命周期一致。线程创建时创建栈,线程...
在方法表中,最特别的是初始化方法(<clinit>),它是Java类加载时执行的静态初始化代码块。而实例构造器(<init>)则是对象创建时执行的初始化代码。 类文件还包含一个异常表(Exception Table),用于在字节码...
clinit-cfn-工具Cloudinit 注入/提取到/从 AWS CloudFormation。 创建此工具的动机是使用与 CloudInit 用户数据文件集成的 CloudFormation 的非常烦人/困难的工作方式。 AWS CloudFormation 使用 JSON 格式,而 ...
- **<clinit> 方法**:用于初始化类或接口的静态成员。 #### 八、异常处理 - **异常体系**:Java虚拟机支持异常处理机制,可以通过try-catch-finally语句来捕获和处理异常。 - **异常传播**:如果方法没有处理异常...
- **初始化**: 类的初始化阶段会执行类构造器 `<clinit>` 方法,用于初始化类变量。 #### 1.4 状态管理 - **状态**: Java中对象的状态可以通过其成员变量来表示,这些状态可以在对象生命周期中发生变化。 - **状态...
3. **初始化对象**:初始化对象的字段为默认值,然后执行对象构造器`<init>()`方法以初始化对象的状态。 4. **设置对象头**:设置对象的对象头信息,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID等...
- **初始化**:执行类构造器`<clinit>()`方法,这是类加载过程的最后一个阶段。 #### 3. 数据类型包装类 Java提供了八种基本数据类型的包装类: - `boolean` -> `Boolean` - `char` -> `Character` - `byte` -> `...
- **初始化**:执行类的构造器<clinit>()方法。 - **1.7 垃圾回收器**: - **概念**:自动管理内存,释放不再使用的对象所占用的空间。 - **机制**:标记-清除算法、复制算法、分代收集等。 - **触发条件**:堆...
例如,一个Common Lisp开发者可能会有一个名为`.clinit.lisp`的点文件,这个文件会在启动Common Lisp环境时自动加载,用于定制环境设置和加载个人的库或工具。 在压缩文件`dotfiles-master`中,我们很可能看到的是...