欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

千鋒扣丁學(xué)堂Java培訓(xùn)之深入理解java中反射機(jī)制

2019-05-22 13:46:49 3136瀏覽

今天千鋒扣丁學(xué)堂Java培訓(xùn)老師給大家介紹一下關(guān)于Java中反射機(jī)制的詳細(xì)介紹,下面我們一起來看一下吧。


什么是反射?

JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意方法和屬性;這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為java語言的反射機(jī)制。

對(duì)反射的最初接觸是學(xué)習(xí)jdbc時(shí),加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)時(shí)會(huì)這樣寫:Class.forName("com.mysql.jdbc.Driver"),當(dāng)時(shí)似懂非懂的也不知道是什么意思,隨著自己的不斷學(xué)習(xí),越來越感覺反射的神奇,讓我們一起來揭開它的神秘面紗吧。

學(xué)習(xí)一個(gè)知識(shí),自然是最先從api開始,反射涉及的類,除了Class類之外,基本上都在java.lang.reflect包里面,常用的類有Constructor,F(xiàn)ield,Method類等,AccessibleObject類是前面三個(gè)類的基類,主要包含設(shè)置安全性檢查等方法,下面,我們看一下reflect包的結(jié)構(gòu)。



反射能用來做什么呢?

我們知道反射機(jī)制允許程序在運(yùn)行時(shí)取得任何一個(gè)已知名稱的class的內(nèi)部信息,包括包括其modifiers(修飾符),fields(屬性),methods(方法)等,并可于運(yùn)行時(shí)改變fields內(nèi)容或調(diào)用methods。那么我們便可以更靈活的編寫代碼,代碼可以在運(yùn)行時(shí)裝配,無需在組件之間進(jìn)行源代碼鏈接,降低代碼的耦合度;還有動(dòng)態(tài)代理的實(shí)現(xiàn)等等;但是需要注意的是反射使用不當(dāng)會(huì)造成很高的資源消耗!

先來看一下反射的具體實(shí)現(xiàn)

下面是一個(gè)基本的類Person

package com.qf.cdxt;public class Person {
    //私有屬性private String name = "AME";
    //公有屬性public int age = 18;
    //構(gòu)造方法public Person() {    
    }
    //私有方法private void eat(){
        System.out.println("private eat()...");
    }
    //公有方法public void play(){
        System.out.println("public play()...");
    }
}

①、得到Class的三種方式

    //1、通過對(duì)象調(diào)用 getClass() 方法來獲取,通常應(yīng)用在:比如你傳過來一個(gè) Object//  類型的對(duì)象,而我不知道你具體是什么類,用這種方法
  Person person1= new Person();
  Class c1 = person1.getClass();
    //2、直接通過 類名.class 的方式得到,該方法最為安全可靠,程序性能更高//  這說明任何一個(gè)類都有一個(gè)隱含的靜態(tài)成員變量 class
  Class c2 = Person.class;
    //3、通過 Class 對(duì)象的 forName() 靜態(tài)方法來獲取,用的最多,//   但可能拋出 ClassNotFoundException 異常

②通過Class類獲取成員變量、成員方法、接口、超類、構(gòu)造方法等

查閱API可以看到Class有很多方法:

getName():獲得類的完整名字。

getFields():獲得類的public類型的屬性。

getDeclaredFields():獲得類的所有屬性。包括private聲明的和繼承類

getMethods():獲得類的public類型的方法。

getDeclaredMethods():獲得類的所有方法。包括private聲明的和繼承類

getMethod(Stringname,Class[]parameterTypes):獲得類的特定方法,name參數(shù)指定方法的名字,parameterTypes參數(shù)指定方法的參數(shù)類型。

getConstructors():獲得類的public類型的構(gòu)造方法。

getConstructor(Class[]parameterTypes):獲得類的特定構(gòu)造方法,parameterTypes參數(shù)指定構(gòu)造方法的參數(shù)類型。

newInstance():通過類的不帶參數(shù)的構(gòu)造方法創(chuàng)建這個(gè)類的一個(gè)對(duì)象。

	String className = c2.getName();
	System.out.println(className);//輸出com.qf.cdxt.Person//獲得類的public類型的屬性。
	Field[] fields = c2.getFields();for(Field field : fields){
	   System.out.println(field.getName());//age
	}
        //獲得類的所有屬性。包括私有的
	Field [] allFields = c2.getDeclaredFields();for(Field field : allFields){
	    System.out.println(field.getName());//name    age
	}
	        //獲得類的public類型的方法。這里包括 Object 類的一些方法
	Method [] methods = c2.getMethods();for(Method method : methods){
	    System.out.println(method.getName());//play waid equls toString hashCode等
	}
	        //獲得類的所有方法。
	Method [] allMethods = c2.getDeclaredMethods();for(Method	 method : allMethods){
	    System.out.println(method.getName());//play eat
	}
	        //獲得指定的屬性
	Field f1 = c2.getField("age");
	System.out.println(f1);//獲得指定的私有屬性
	Field f2 = c2.getDeclaredField("name");//啟用和禁用訪問安全檢查的開關(guān),值為 true,則表示反射的對(duì)象在使用時(shí)應(yīng)該取消 java 語言的訪問檢查;反之不取消
	f2.setAccessible(true);
	System.out.println(f2);
	                //創(chuàng)建這個(gè)類的一個(gè)對(duì)象Object p2 =  c2.newInstance();//將 p2 對(duì)象的  f2 屬性賦值為 Fy,f2 屬性即為 私有屬性 name
	f2.set(p2,"Fy");//使用反射機(jī)制可以打破封裝性,導(dǎo)致了java對(duì)象的屬性不安全。 
	System.out.println(f2.get(p2)); //Fy//獲取構(gòu)造方法
	Constructor [] constructors = c2.getConstructors();for(Constructor constructor : constructors){
	    System.out.println(constructor.toString());//public com.ys.reflex.Person()
	}

以上就是關(guān)于千鋒扣丁學(xué)堂Java培訓(xùn)之深入理解java中反射機(jī)制的全部?jī)?nèi)容,想要學(xué)好Java開發(fā)小編給大家推薦口碑良好的扣丁學(xué)堂,扣丁學(xué)堂有專業(yè)老師制定的Java學(xué)習(xí)路線圖輔助學(xué)員學(xué)習(xí),此外還有與時(shí)俱進(jìn)的Java課程體系和Java視頻教程供大家學(xué)習(xí),想要學(xué)好Java開發(fā)技術(shù)的小伙伴快快行動(dòng)吧。扣丁學(xué)堂Java技術(shù)交流群:850353792。


扣丁學(xué)堂微信公眾號(hào)                          Python全棧開發(fā)爬蟲人工智能機(jī)器學(xué)習(xí)數(shù)據(jù)分析免費(fèi)公開課直播間

【關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料】         【掃碼進(jìn)入Python全棧開發(fā)免費(fèi)公開課】



查看更多關(guān)于“Java開發(fā)資訊”的相關(guān)文章>>

標(biāo)簽: Java培訓(xùn) Java視頻教程 Java多線程 Java面試題 Java學(xué)習(xí)視頻 Java開發(fā)

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國(guó)免費(fèi)咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號(hào)中關(guān)村智誠(chéng)科創(chuàng)大廈4層
京ICP備2021002079號(hào)-2   Copyright ? 2017 - 2022
返回頂部 返回頂部