日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

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

系統(tǒng) 1779 0
在Java開(kāi)發(fā)特別是數(shù)據(jù)庫(kù)開(kāi)發(fā)中,經(jīng)常會(huì)用到Class.forName( )這個(gè)方法。通過(guò)查詢(xún)Java Documentation我們會(huì)發(fā)現(xiàn)使用Class.forName( )靜態(tài)方法的目的是為了動(dòng)態(tài)加載類(lèi)。在加載完成后,一般還要調(diào)用Class下的newInstance( )靜態(tài)方法來(lái)實(shí)例化對(duì)象以便操作。因此,單單使用Class.forName( )是動(dòng)態(tài)加載類(lèi)是沒(méi)有用的,其最終目的是為了實(shí)例化對(duì)象。 ?
?? 這里有必要提一下就是Class下的newInstance()和new有什么區(qū)別?,首先,newInstance( )是一個(gè)方法,而new是一個(gè)關(guān)鍵字,其次,Class下的newInstance()的使用有局限,因?yàn)樗蓪?duì)象只能調(diào)用無(wú)參的構(gòu)造函數(shù),而使用 new關(guān)鍵字生成對(duì)象沒(méi)有這個(gè)限制。 ?
?? 好,到此為止,我們總結(jié)如下: ?
?? Class.forName("")返回的是類(lèi) ?
?? Class.forName("").newInstance()返回的是object ?
?? 有數(shù)據(jù)庫(kù)開(kāi)發(fā)經(jīng)驗(yàn)朋友會(huì)發(fā)現(xiàn),為什么在我們加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)包的時(shí)候有的卻沒(méi)有調(diào)用newInstance( )方法呢?即有的jdbc連接數(shù)據(jù)庫(kù)的寫(xiě)法里是Class.forName(xxx.xx.xx);而有一 些:Class.forName(xxx.xx.xx).newInstance(),為什么會(huì)有這兩種寫(xiě)法呢?
?? 剛才提到,Class.forName("");的作用是要求JVM查找并加載指定的類(lèi),如果在類(lèi)中有靜態(tài)初始化器的話(huà),JVM必然會(huì)執(zhí)行該類(lèi)的靜態(tài)代碼 段。而在JDBC規(guī)范中明確要求這個(gè)Driver類(lèi)必須向DriverManager注冊(cè)自己,即任何一個(gè)JDBC?Driver的 Driver類(lèi)的代碼都必須類(lèi)似如下:
??
          
            1
          
          
            public
          
          
            class
          
           MyJDBCDriver 
          
            implements
          
          
             Driver {

          
          
            2
          
          
            static
          
          
             {

          
          
            3
          
                DriverManager.registerDriver(
          
            new
          
          
             MyJDBCDriver());

          
          
            4
          
          
               }

          
          
            5
          
           }
        

?

既然在靜態(tài)初始化器的中已經(jīng)進(jìn)行了注冊(cè),所以我們?cè)谑褂肑DBC時(shí)只需要Class.forName(XXX.XXX);就可以了。
?
貼出Proxool 連接池的靜態(tài)初始化方法:
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將使用類(lèi)A的類(lèi)裝載器, 將類(lèi)A裝入內(nèi)存(前提是:類(lèi)A還沒(méi)有裝入內(nèi)存),不對(duì)類(lèi)A做類(lèi)的初始化工作.返回類(lèi)A的Class的對(duì)象。

2:Class cl=對(duì)象引用o.getClass();

? ? ? ? ? ? ? ? ? 返回引用o運(yùn)行時(shí)真正所指的對(duì)象(因?yàn)?子對(duì)象的引用可能會(huì)賦給父對(duì)象的引用變量中)所屬的類(lèi)的Class的對(duì)象 。

3:Class.forName("類(lèi)名");

? ? ? ? ? ? ? ? ? .裝入類(lèi)A,并做類(lèi)的初始化

.getClass()是動(dòng)態(tài)的,其余是靜態(tài)的。

.class和class.forName()只能返回類(lèi)內(nèi)field的默認(rèn)值,getClass可以返回當(dāng)前對(duì)象中field的最新值

Class.forName() 返回的是一個(gè)類(lèi), .newInstance() 后才創(chuàng)建一個(gè)對(duì)象, Class.forName()的作用是要求JVM查找并加載指定的類(lèi),也就是說(shuō)JVM會(huì)執(zhí)行該類(lèi)的

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將使用類(lèi)A的類(lèi)裝載器,將類(lèi)A裝入內(nèi)存(前提是:類(lèi)A還沒(méi)有裝入內(nèi)存),不對(duì)類(lèi)A做類(lèi)的初始化工作
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 ???????????? // 實(shí)例化對(duì)象,因?yàn)檫@一句才會(huì)輸出“靜態(tài)初始化”以及“初始化”
23 ???????????? Object obj3 = classtype3.newInstance();
24 ???????????? // 通過(guò)實(shí)例化后的對(duì)象調(diào)用方法
25 ???????????? getMethod3.invoke(obj3); // 獲取默認(rèn)值
26 ???????????? setMethod3.invoke(obj3, "Setting new ", 3); // 設(shè)置
27 ???????????? getMethod3.invoke(obj3); // 獲取最新
28 ???????????? System.out.println("----------------" );
29
30 ???????????? // 返回運(yùn)行時(shí)真正所指的對(duì)象
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); // 獲取默認(rèn)值
38 ???????????? setMethod.invoke(p, "Setting new ", 1); // 設(shè)置
39 ???????????? getMethod.invoke(p); // 獲取最新
40 ???????????? System.out.println("----------------" );
41
42 ???????????? // 裝入類(lèi),并做類(lèi)的初始化
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 ???????????? // 實(shí)例化對(duì)象
50 ???????????? Object obj2 = classtype2.newInstance();
51 ???????????? // 通過(guò)實(shí)例化后的對(duì)象調(diào)用方法
52 ???????????? getMethod2.invoke(obj2); // 獲取默認(rèn)值
53 ???????????? setMethod2.invoke(obj2, "Setting new ", 2); // 設(shè)置
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 ,類(lèi)名.class,,class.forName(),,g


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 湘西| 宣武区| 江津市| 渭南市| 纳雍县| 犍为县| 务川| 卓尼县| 大兴区| 驻马店市| 曲阜市| 福清市| 瓮安县| 榆树市| 衡阳县| 司法| 义乌市| 岳阳县| 海原县| 阳信县| 曲周县| 东宁县| 巨野县| 黑河市| 澎湖县| 衢州市| 隆化县| 永康市| 高淳县| 阿鲁科尔沁旗| 祥云县| 庆阳市| 托克逊县| 浮梁县| 龙江县| 彭山县| 眉山市| 博客| 思南县| 苏尼特右旗| 龙江县|