Java反射中Class.forName和classloader的區別


Java中Class.forName和classloader都可以用來對類進行加載。

 

Class.forName除了將類的.class文件加載到jvm中之外,還會對類進行解釋,執行類中的static塊。

而classloader只干一件事情,就是將.class文件加載到jvm中,不會執行static中的內容,只有在newInstance才會去執行static塊。

 

Class.forName(name,initialize,loader)帶參數也可控制是否加載static塊。並且只有調用了newInstance()方法采用調用構造函數,創建類的對象。

package com.yu.java.reflect;

public class Line {
    static {
        System.out.println("static code executing: loading line...");
    }
}
package com.yu.java.reflect;

public class Point {
    static {
        System.out.println("static code executing: loading point...");
    }
}
package com.yu.java.reflect;

public class ClassLoaderAndForNameTest {

    public static void main(String[] args) {
        String wholeNameLine = "com.mangosoft.java.reflect.Line";
        String wholeNamePoint = "com.mangosoft.java.reflect.Point";

        System.out.println("classloader testing...");
        testClassLoader(wholeNameLine, wholeNamePoint);
        System.out.println("---------------------------------------");
        System.out.println("Class.forName testing...");
        testForName(wholeNameLine, wholeNamePoint);
    }

    //classloader
    public static void testClassLoader(String wholeNameLine, String wholeNamePoint) {
        ClassLoader loader = ClassLoader.getSystemClassLoader();
        Class<?> line;
        Class<?> point;
        try {
            line = loader.loadClass(wholeNameLine);
            point = loader.loadClass(wholeNamePoint);
            System.out.println("line " + line.getName());
            System.out.println("point " + point.getName());
        } catch (ClassNotFoundException e){
            e.printStackTrace();
        }
    }

    //Class.forName
    public static void testForName(String wholeNameLine, String wholeNamePoint) {
        try {
            Class line = Class.forName(wholeNameLine);
            Class point = Class.forName(wholeNamePoint);
            System.out.println("line " + line.getName());
            System.out.println("point " + point.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

運行結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM