2016-11-24 2 views
1

Ich habe eine Klasse Schüler, diejava class.forClass() vs Klasse Erklärung

ist
package org.ahmed; 

public class Student { 

    public Student() { 
     // TODO Auto-generated constructor stub 
     System.out.println("Generated constructor"); 
    } 

    static { // static block 
     System.out.println("Hello world static"); 
    } 

    { // insance block 
     System.out.println("Hello world non static"); 
    } 
} 

und dann

public class Main { 

    public static void main(String[] args) throws ClassNotFoundException { 
     Class.forName("org.ahmed.Student"); // this line causing static block execution in Student class 
     // Student s; // this line doesn't execute the static block. 
    } 
} 

Ich verstehe Class.forClass() unter Verwendung wir können dynamisch jede Klasse zur Laufzeit ausgeführt werden. Aber ich habe einige Fragen in Bezug auf statischen Block.

Wenn ich Class.forClass("org.ahmed.Student") in meiner main Methode verwenden, dann ist es den statischen Block von Student ausführt. Aber wenn ich Student s in main Methode deklariere es führt nicht den statischen Block. Ich dachte Class.forClass("ClassName") ist das gleiche wie deklarieren Klasse mit einer Variablen Namen.

+0

Eigentlich ist es "Class.forName()", nicht "Class.forClass()". –

Antwort

2

Wenn Sie Class.forName("org.ahmed.Student") Sie tatsächlich die JVM zwingen, die Klasse zu laden und Rufen Sie seine statischen Blöcke auf. Sie können mehr lesen here.

+0

Also, wenn ich nur die Klassenreferenz mit einem Variablennamen deklarieren, sind die statischen Ausführungen nicht garantiert? wie Studenten s? –

-1

Das Deklarieren der Klassenreferenzen lädt die Klasse in JVM, daher wird der statische Block ausgeführt. ich bin der Lage, statische Blockausführung um zu sehen, auf

Student s; 

Beispiel:

package com.snofty.test; 

public class Classloading {

public ClassLoading(){ 
    System.out.println("in constructor"); 
} 
static { 
    System.out.println("in static block"); 
} 

{ 
    System.out.println("in instance block"); 
} 
public static void main(String[] args) { 
    ClassLoading classLoading; 

} 

}

Class.forName() 

es verwendet wird, laden die Klasse dynamisch durch Übergabe der cl ass Name beispiels

public void loadClass(String className){ 
    Class.forName(className); 
} 
+1

Student s, verursacht in meinem Fall keine statische Ausführung !!! –

+0

meine schlechte .. ich war die Hauptmethode in der gleichen Klasse ClassLoaderTest Klasse ausgeführt wurde daher in der Lage, die statische Blockausführung zu sehen .. – snofty

1

Von javadoc:

Aufrufen Class.forName(className) Methode ist entspricht: Class.forName(className, true, currentLoader), wobei der zweite Parameter gibt an, ob oder nicht, wird die Klasse initialisiert werden.

Also, wenn Sie nicht die Klasse initialisieren wollen, rufen Sie einfach die Methode mit initialize = false, zB:

Class.forName("org.ahmed.Student", false, this.getClass().getClassLoader())} 
+0

Danke für die Antwort. –

3

Es gibt einen Unterschied zwischen Laden eine Klasse (JLS§5.3 und, wie ich glaube, JLS§5.4) und Initialisierung eine Klasse (JLS§5.5). Standardmäßig funktioniert Class.forName beides, obwohl es an override you can use gibt, mit dem Sie steuern können, ob die Klasse initialisiert werden soll.

Wenn Sie einfach eine Student Variable deklarieren, wird die Klasse nicht initialisiert. In der Tat initialisiert selbst die Bezugnahme auf Student.class die Klasse nicht.Sie müssen etwas tun, um die Initialisierung auszulösen, z. B. etwas, das die Bytecode-Operationen , getstatic, putstatic oder invokestatic mit der Klasse verwendet (für Details siehe jedoch den Link zu §5.5. Es gibt andere Dinge, die die Klasse initialisieren).

So zum Beispiel, wenn Sie Student ein öffentliches Feld gab:

public static String foo = "bar"; 

... und dann in Main.main Sie tat:

System.out.println(Student.foo); 

... dass Initialisierung auslösen würde von die Klasse.

+0

Danke für die Antwort. @ T.J. Crowd –