Class.forName(),Class.forName().newInstance

系统 1436 0
在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法。通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,单单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。  
   这里有必要提一下就是Class下的newInstance()和new有什么区别?,首先,newInstance( )是一个方法,而new是一个关键字,其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用 new关键字生成对象没有这个限制。  
   好,到此为止,我们总结如下:  
   Class.forName("")返回的是类  
   Class.forName("").newInstance()返回的是object  
   有数据库开发经验朋友会发现,为什么在我们加载数据库驱动包的时候有的却没有调用newInstance( )方法呢?即有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一 些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢?
   刚才提到,Class.forName("");的作用是要求JVM查找并加载指定的类,如果在类中有静态初始化器的话,JVM必然会执行该类的静态代码 段。而在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的 Driver类的代码都必须类似如下:
  
          
            1
          
          
            public
          
          
            class
          
           MyJDBCDriver 
          
            implements
          
          
             Driver {

          
          
            2
          
          
            static
          
          
             {

          
          
            3
          
                DriverManager.registerDriver(
          
            new
          
          
             MyJDBCDriver());

          
          
            4
          
          
               }

          
          
            5
          
           }
        

 

既然在静态初始化器的中已经进行了注册,所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了。
 
贴出Proxool 连接池的静态初始化方法:
1 public class ProxoolDriver implements Driver {
2      private static final Log LOG = LogFactory.getLog(ProxoolDriver. class );
3      static {
4          try {
5              DriverManager.registerDriver( new ProxoolDriver());
6          } catch (SQLException e) {
7             System.out.println(e.toString());
8         }
9     }
10 }

 

1: Class cl=A.class;  

                  JVM将使用类A的类装载器, 将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作.返回类A的Class的对象。

2:Class cl=对象引用o.getClass();

                  返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象 。

3:Class.forName("类名");

                  .装入类A,并做类的初始化

.getClass()是动态的,其余是静态的。

.class和class.forName()只能返回类内field的默认值,getClass可以返回当前对象中field的最新值

Class.forName() 返回的是一个类, .newInstance() 后才创建一个对象, Class.forName()的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的

1 public class Person {
2      private String name = "Alfira" ;
3      public void getName() {
4         System.out.println(name);
5     }
6      public void setName(String name, int a) {
7          this .name = name + a;
8     }
9 }
 1 import java.lang.reflect.Method;
2
3 public class Test {
4
5      /**
6      * @param args
7       */
8      public static void main(String[] args) {
9          show("yerasel.Person" );
10     }
11
12      private static void show(String name) {
13          try {
14              // JVM将使用类A的类装载器,将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作
15              Class classtype3 = Person. class ;
16              // 获得classtype中的方法
17              Method getMethod3 = classtype3.getMethod("getName", new Class[] {});
18              Class[] parameterTypes3 = { String. class , int . class };
19              Method setMethod3 = classtype3
20                      .getMethod("setName" , parameterTypes3);
21
22              // 实例化对象,因为这一句才会输出“静态初始化”以及“初始化”
23              Object obj3 = classtype3.newInstance();
24              // 通过实例化后的对象调用方法
25              getMethod3.invoke(obj3); // 获取默认值
26              setMethod3.invoke(obj3, "Setting new ", 3); // 设置
27              getMethod3.invoke(obj3); // 获取最新
28              System.out.println("----------------" );
29
30              // 返回运行时真正所指的对象
31              Person p = new Person();
32              Class classtype = p.getClass(); // Class.forName(name);
33              // 获得classtype中的方法
34              Method getMethod = classtype.getMethod("getName", new Class[] {});
35              Class[] parameterTypes = { String. class , int . class };
36              Method setMethod = classtype.getMethod("setName" , parameterTypes);
37              getMethod.invoke(p); // 获取默认值
38              setMethod.invoke(p, "Setting new ", 1); // 设置
39              getMethod.invoke(p); // 获取最新
40              System.out.println("----------------" );
41
42              // 装入类,并做类的初始化
43              Class classtype2 = Class.forName(name);
44              // 获得classtype中的方法
45              Method getMethod2 = classtype2.getMethod("getName", new Class[] {});
46              Class[] parameterTypes2 = { String. class , int . class };
47              Method setMethod2 = classtype2
48                      .getMethod("setName" , parameterTypes2);
49              // 实例化对象
50              Object obj2 = classtype2.newInstance();
51              // 通过实例化后的对象调用方法
52              getMethod2.invoke(obj2); // 获取默认值
53              setMethod2.invoke(obj2, "Setting new ", 2); // 设置
54              getMethod2.invoke(obj2); // 获取最新
55
56              System.out.println("----------------" );
57
58          } catch (Exception e) {
59             System.out.println(e);
60         }
61     }
62 }

Class.forName(),Class.forName().newInstance() ,New ,类名.class,,class.forName(),,g


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论