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()方法采用调用构造函数,创建类的对象。

 

代码如下:

复制代码
 1 package com.mangosoft.java.reflect;
 2 
 3 /**
 4  * Created by zhangshengjian on 2017/3/1.
 5  */
 6 public class Line {
 7     static {
 8         System.out.println("static code executing: loading line...");
 9     }
10 }
复制代码
复制代码
 1 package com.mangosoft.java.reflect;
 2 
 3 /**
 4  * Created by zhangshengjian on 2017/3/1.
 5  */
 6 public class Point {
 7     static {
 8         System.out.println("static code executing: loading point...");
 9     }
10 }
复制代码
复制代码
 1 package com.mangosoft.java.reflect;
 2 
 3 /**
 4  * classloader和Class.forName的区别
 5  *
 6  * Created by zhangshengjian on 2017/3/1.
 7  */
 8 public class ClassLoaderAndForNameTest {
 9 
10     public static void main(String[] args) {
11         String wholeNameLine = "com.mangosoft.java.reflect.Line";
12         String wholeNamePoint = "com.mangosoft.java.reflect.Point";
13 
14         System.out.println("classloader testing...");
15         testClassLoader(wholeNameLine, wholeNamePoint);
16         System.out.println("---------------------------------------");
17         System.out.println("Class.forName testing...");
18         testForName(wholeNameLine, wholeNamePoint);
19     }
20 
21     //classloader
22     public static void testClassLoader(String wholeNameLine, String wholeNamePoint) {
23         ClassLoader loader = ClassLoader.getSystemClassLoader();
24         Class<?> line;
25         Class<?> point;
26         try {
27             line = loader.loadClass(wholeNameLine);
28             point = loader.loadClass(wholeNamePoint);
29             System.out.println("line " + line.getName());
30             System.out.println("point " + point.getName());
31         } catch (ClassNotFoundException e){
32             e.printStackTrace();
33         }
35     }
36 
37     //Class.forName
38     public static void testForName(String wholeNameLine, String wholeNamePoint) {
39         try {
40             Class line = Class.forName(wholeNameLine);
41             Class point = Class.forName(wholeNamePoint);
42             System.out.println("line " + line.getName());
43             System.out.println("point " + point.getName());
44         } catch (ClassNotFoundException e) {
45             e.printStackTrace();
46         }
47     }
48 }
复制代码

 

运行结果如下:

 

三  数据库链接为什么使用Class.forName(className)

 

JDBC  Driver源码如下,因此使用Class.forName(classname)才能在反射回去类的时候执行static块。

复制代码
static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}
复制代码

猜你喜欢

转载自blog.csdn.net/qq_39781497/article/details/80771628
今日推荐