2015-01-08 11 views
13

Nigdy nie słyszałem o premain i czuję się trochę głupi, aby zapytać, ale the answer of this post sugeruje, aby go uruchomić, aby uzyskać obiekt Instrumentation. Ale w jaki sposób wywoływana jest ta funkcja lub jak sprawić, by była wywoływana?Co to jest premain() i jak jest wywoływana?

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); 
    } 
} 
+1

Odpowiedź na twoje pytanie znajduje się na [tej stronie] (http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html) –

Odpowiedz

6

minimalna uruchamialny przykład

GitHub powyżej: https://github.com/cirosantilli/java-cheat/tree/d73d2786cad458973a6b46bc98b9faabae65f3e1/instrument

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())); 
    } 
} 

Makefile: wyjście

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

Próbka:

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

Testowany w Ubuntu 16.10, Java HotSpot 1.8.0_92.

9

premain to mechanizm związany z pakietem java.lang.instrument służących do załadunku „agentów”, które sprawiają, że zmiany bajt-kodu w programach Javy.

Mechanizm jest wyjaśniony w java.lang.instrument documentation.

Istota tego polega na tym, że "agent" jest umieszczony w słoiku, a ten słoik ma specjalny wpis w swoim manifeście, który informuje pakiet oprzyrządowania, gdzie szukać metody premain. Źródło, które zacytowałeś, powinno być prostym agentem.