Java 什么是premain()以及如何调用它?

Java 什么是premain()以及如何调用它?,java,methods,Java,Methods,我从未听说过premain,我觉得这样问有点愚蠢,但建议运行它以获得Instrumentation对象 但是如何调用该函数,或者如何使其被调用 package playground; import java.lang.instrument.Instrumentation; public class ObjectSizeFetcher { private static Instrumentation instrumentation; public static void pre

我从未听说过
premain
,我觉得这样问有点愚蠢,但建议运行它以获得
Instrumentation
对象

但是如何调用该函数,或者如何使其被调用

package playground;
import java.lang.instrument.Instrumentation;

public class ObjectSizeFetcher {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

premain
是与
java.lang.instrument
包关联的机制,用于加载在java程序中更改字节码的“代理”

该机制在中进行了解释


其要点是“代理”部署在一个jar中,jar的清单中有一个特殊的条目,它告诉检测包在哪里查找premain方法。您引用的源应该是一个简单代理。

最小可运行示例

GitHub上游:

META-INF/MANIFEST.MF

Premain-Class: Sizeof
Sizeof.java

import java.lang.instrument.Instrumentation;

final public class Sizeof {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long sizeof(Object o) {
        return instrumentation.getObjectSize(o);
    }
}
Main.java

final public class Main {
    public static void main(String [] args) {
        System.out.println("Object");
        System.out.println(Sizeof.sizeof(new Object()));

        System.out.println("/\"\"");
        System.out.println(Sizeof.sizeof(""));

        System.out.println("/\"abc\"");
        System.out.println(Sizeof.sizeof("abc"));

        System.out.println("int[0]");
        System.out.println(Sizeof.sizeof(new int[0]));

        System.out.println("int[10]");
        System.out.println(Sizeof.sizeof(new int[10]));

        class OneInt {
            public int i;
        }
        System.out.println("OneInt");
        System.out.println(Sizeof.sizeof(new OneInt()));

        class TwoInts {
            public int i;
            public int j;
        }
        System.out.println("TwoInts");
        System.out.println(Sizeof.sizeof(new TwoInts()));

        class IntArray0 {
            int[] i = new int[0];
        }
        System.out.println("IntArray0");
        System.out.println(Sizeof.sizeof(new IntArray0()));

        class IntArray10 {
            int[] i = new int[10];
        }
        System.out.println("IntArray10");
        System.out.println(Sizeof.sizeof(new IntArray10()));
    }
}
生成文件

all:
    javac *.java
    jar -cfm Sizeof.jar META-INF/MANIFEST.MF Sizeof.class
    java -ea -javaagent:Sizeof.jar Main
样本输出:

Object
16
/""
24
/"abc"
24
int[0]
16
int[10]
56
OneInt
16
TwoInts
24
IntArray0
16
IntArray10
16

在Ubuntu 16.10、Java HotSpot 1.8.0_92中进行测试。

您的问题的答案是关于以下源代码的: