類名.class是Class對(duì)象的句柄,每個(gè)被加載的類,在jvm中都會(huì)有一個(gè)Class對(duì)象與之相對(duì)應(yīng),如果要?jiǎng)?chuàng)建新的對(duì)象,直接使用Class對(duì)象的局部class.forName就可以了,不需要用new 類名。
在java中,每個(gè)class都有一個(gè)相應(yīng)的Class對(duì)象,當(dāng)編寫(xiě)好一個(gè)類,編譯完成后,在生成的.class文件中,就產(chǎn)生一個(gè)class對(duì)象,用來(lái)表示這個(gè)類的類型信息。獲得Class實(shí)例的三中方式:1.利用對(duì)象調(diào)用getClass()方法獲取該對(duì)象的Class實(shí)例2.使用Class的靜態(tài)方法forName(),用類的名字獲取一個(gè)Class實(shí)例3.運(yùn)用.calss的方式獲取Class實(shí)例,對(duì)基本數(shù)據(jù)類型的封裝類,還可以采用.TYPE來(lái)獲取對(duì)應(yīng)的基本數(shù)據(jù)類型的Class實(shí)例
calss ClassTest{ public static void main(String[] args) { /* //利用對(duì)象調(diào)用getClass()方法獲取該對(duì)象的Class實(shí)例 Point pt=new Point(); Class c1=pt.getClass(); System.out.PRintln(c1.getName()); //結(jié)果:Point //使用Class的靜態(tài)方法forName(),用類的名字獲取一個(gè)Class實(shí)例 try { Class c2=Class.forName("Point"); System.out.println(c2.getName()); //結(jié)果:Point } catch(Exception e) { e.printStackTrace(); } //運(yùn)用.calss的方式獲取Class實(shí)例(類) Class c3=Point.calss; System.out.println(c3.getName()); //結(jié)果:Point //運(yùn)用.calss的方式獲取Class實(shí)例(基本類型) Class c4=int.calss; System.out.println(c4.getName()); //結(jié)果:int //運(yùn)用.calss的方式獲取Class實(shí)例(基本數(shù)據(jù)類型的封裝類) Class c5=Integer.TYPE; System.out.println(c5.getName()); //結(jié)果:int Class c6=Integer.class; System.out.println(c6.getName()); //結(jié)果:java.lang.Integer */ //以下結(jié)果是: before new Point() loading point after new Point() loading Line //當(dāng)new Point()的時(shí)候加載這個(gè)類,用forName構(gòu)造實(shí)例的時(shí)候也加載該類。 System.out.println("before new Point()"); new Point(); System.out.println("after new Point()"); try { Class.forName("Line"); }catch(Exception e) { e.printStackTrace(); } }}class Point(){ static { System.out.println("loading point"); } int x,y;}class Line{ static { System.out.println("loading Line"); }}在運(yùn)行期間,如果我們要產(chǎn)生某個(gè)類的對(duì)象,java虛擬機(jī)會(huì)檢測(cè)該類型的Class對(duì)象是否已被加載。如果沒(méi)有加載,java虛擬機(jī)會(huì)根據(jù)類的名稱找到.class文件并加載它。一旦某個(gè)類型的Class對(duì)象已經(jīng)被加載到內(nèi)存,就可以用它來(lái)產(chǎn)生該類型的所有對(duì)象。newInstance()調(diào)用內(nèi)中缺省的構(gòu)造方法。
newInstance()調(diào)用類中缺省的構(gòu)造方法,如果要實(shí)例的對(duì)象中有了自己定義的構(gòu)造方法(除重寫(xiě)的和默認(rèn)構(gòu)造方法相同的構(gòu)造方法外)創(chuàng)建此 Class 對(duì)象所表示的類的一個(gè)新實(shí)例
class ClassTest{ public static void main(String[] args) { if(args.length!=1) { System.out.println("args.length!=1"); return; } try { Class c=Class.forName(args[0]); Point pt=(Point)c.newInstance(); pt.output(); }catch(Exception e) { e.printStackTrace(); } }}class Point{ int x; int y; static { System.out.println("Loading point"); } void output() { System.out.println("x="+x+",y="+y); }}當(dāng)我們?cè)诿钐崾痉旅婢幾g好該類之后,輸入java ClassTest Point的時(shí)候,此時(shí)會(huì)輸出Loading point和x=0,y=0
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注