涨薪关键之反射机制,引得项目经理对你的看重,加薪触手可及!!!!
前言
就比如我前幾天被面試官問(wèn)什么是反射???
而我的回答是!!!
反射是動(dòng)態(tài)語(yǔ)言的關(guān)鍵,反射允許程序在執(zhí)行期間借助Reflection API取得任何類(lèi)的內(nèi)部信息,并能直接操作任曦對(duì)象的內(nèi)部屬性及方法。
1.Java反射提供的功能
- 在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類(lèi)
- 在運(yùn)行時(shí)構(gòu)造任意一個(gè)類(lèi)的對(duì)象
- 在運(yùn)行時(shí)判斷任意一個(gè)類(lèi)具有的成員變量和方法
- 在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的成員變量和方法
2.放射常用的API
- java.lang.Class : 代表一個(gè)類(lèi)
- java.lang.reflect.Method:代表類(lèi)的方法
- java.lang.reflect.Field:代表類(lèi)的成員變量
- java .lang.reflect.Construct:代表類(lèi)的構(gòu)造方法
3.java.lang.Class
我們創(chuàng)建一個(gè)類(lèi),通過(guò)編譯(Javac.exe),生成對(duì)應(yīng)的.class文件。之后我們使用java.exe加載(JVM類(lèi)加載器)此.class文件。此.class文件加載到內(nèi)存以后,就是一個(gè)運(yùn)行時(shí)類(lèi)。存放在緩沖區(qū),Class允許通過(guò)一個(gè)實(shí)例化對(duì)象找到一個(gè)類(lèi)的完成信息資料。
Class類(lèi)的作用:
- 1.每一個(gè)運(yùn)行時(shí)類(lèi)只加載一次!
- 2.獲取對(duì)應(yīng)的運(yùn)行時(shí)類(lèi)的完整結(jié)構(gòu)(屬性,方法,構(gòu)造器,內(nèi)部類(lèi),父類(lèi),所在包,異常,注 解。。。。) ?
- 3.調(diào)用對(duì)應(yīng)的運(yùn)行時(shí)類(lèi)的指定結(jié)構(gòu)(屬性,方法,構(gòu)造器)
- 4.反射應(yīng)用:動(dòng)態(tài)代理
4.獲取Class對(duì)象。
1.調(diào)用運(yùn)行時(shí)類(lèi)本身的.class屬性
Class<Person> personClass01 = Person.class;2.通過(guò)運(yùn)行時(shí)類(lèi)的一個(gè)對(duì)象
Person person = new Person(); Class<? extends Person> aClass = person.getClass();3.通過(guò)Class.forName("com.jdy.bean.Dog")
Class<?> aClass1 = Class.forName("com.jdy.bean.Dog");4.通過(guò)類(lèi)的加載器
ClassLoader classLoader = this.getClass().getClassLoader();5.Class類(lèi)的常用方法
public Constructor<?>[] getConstructors() throws SecurityException //獲取類(lèi)的全部構(gòu)造 public Field[] getDeclaredFields() throws SecurityException//獲取類(lèi)中全部的屬性 public Field[] getFields() throws SecurityException //獲取繼承的全部屬性 public Method[] getMethods() throws SecurityException//獲取一個(gè)類(lèi)中的所有方法 public Class<?>[] getInterfaces() //獲取類(lèi)實(shí)現(xiàn)的所有接口 public native Class<? super T> getSuperclass();//獲取類(lèi)的父類(lèi) //加入Java開(kāi)發(fā)交流君樣:593142328一起吹水聊天6.Class應(yīng)用
(1)通過(guò)無(wú)參構(gòu)造實(shí)例化對(duì)象
String packageName ="com.jdy.bean.Dog"; Class<?> aClass = Class.forName(packageName); Dog dog = (Dog)aClass.newInstance(); //使用newInstance()必須保證實(shí)例化類(lèi)中存在一個(gè)無(wú)參構(gòu)造器(2)調(diào)用有參構(gòu)造器實(shí)例化對(duì)象
public int getModifiers()//獲取構(gòu)造方法的修飾符 public String getName()//獲取構(gòu)造方法的名稱(chēng) public Class<?>[] getParameterTypes()//獲取構(gòu)造方法的參數(shù)類(lèi)型 public T newInstance(Object ... initargs)//像構(gòu)造方法,傳入?yún)?shù)實(shí)例化對(duì)象 <Dog> constructor = (Constructor<Dog>) aClass.getConstructor(String.class, String.class, String.class); Dog dog1 = constructor.newInstance("二狗子", "黑背", "8");(3)獲取類(lèi)結(jié)構(gòu)
- Constructor:表示類(lèi)的構(gòu)造器
- Field:表示類(lèi)的屬性
- Method:表示類(lèi)的方法
取得所有實(shí)現(xiàn)的接口
[] interfaces = aClass.getInterfaces();取得父類(lèi)
Class<?> superclass = aClass.getSuperclass();取得全部構(gòu)造器
Constructor<?>[] constructors = aClass.getConstructors();將訪(fǎng)問(wèn)修飾符由數(shù)字轉(zhuǎn)化成可看懂的
int modifiers = declaredField.getModifiers(); System.out.println("modifiers = " + Modifier.toString(modifiers));取得所有的方法
Method[] methods = aClass.getMethods();取得全部屬性
//得到實(shí)現(xiàn)的接口或父類(lèi)中的公共屬性 Field[] fields = aClass.getFields(); //得到本類(lèi)當(dāng)中的全部屬性 Field[] declaredFields = aClass.getDeclaredFields();Field的常用方法
//得到一個(gè)對(duì)象中屬性的具體內(nèi)容 public Object get(Object obj)throws IllegalArgumentException, IllegalAccessException //設(shè)置指定對(duì)象中屬性的具體內(nèi)容 public void set(Object obj, Object value) throws IllegalArgumentException, IllegalAccessException//得到屬性的修飾符 public int getModifiers() //返回屬性的名稱(chēng) public String getName() //判斷屬性是否可悲外部訪(fǎng)問(wèn) public boolean isAccessible() //設(shè)置一個(gè)屬性是否可被外部方法 public void setAccessible(boolean flag) throws SecurityException //加入Java開(kāi)發(fā)交流君樣:593142328一起吹水聊天(4)通過(guò)反射待用類(lèi)中的方法
Method destory_method = aClass.getMethod("destory_method"); //invoke方法的參數(shù)是一個(gè)實(shí)例化的對(duì)象 Object invoke = destory_method.invoke(aClass.newInstance());(5)通過(guò)方法操作屬性
反射中通過(guò)Field類(lèi)提供的set()/get()完成設(shè)置和取得屬性?xún)?nèi)容的操作,但是類(lèi)中的屬性都設(shè)置成私有的訪(fǎng)問(wèn)權(quán)限,所以在使用set()/get()方法時(shí)首先要使用Field()中的setAccessible(true),方法將需要操作的屬性設(shè)置成可被外部訪(fǎng)問(wèn)。
Field field0 = personClass.getDeclaredField("address"); //todo 什么校驗(yàn) field0.setAccessible(true); field0.set(person,"xian"); System.out.println(person);一般給類(lèi)的屬性賦值,不建議使用以上方法,因?yàn)閿U(kuò)大了屬性的訪(fǎng)問(wèn)權(quán)限,建議使用類(lèi)中屬性的getter/setter方法
5.ClassLoader:類(lèi)的加載器 類(lèi)的加載器是用來(lái)把類(lèi)(class)裝載進(jìn)內(nèi)存的,JVM規(guī)范定義了兩種類(lèi)型的類(lèi)加載器: 啟動(dòng)類(lèi)加載器(bootstrap) 用戶(hù)類(lèi)加載器(user-defind class loader) JVM 在運(yùn)行時(shí)會(huì)產(chǎn)生3個(gè)類(lèi)加載器組成的初始化加載器層次結(jié)構(gòu)
Bootstrap ClassLoader:引導(dǎo)類(lèi)加載器:用C++編寫(xiě),時(shí)jVM自帶的類(lèi)加載器,負(fù)責(zé)JAVA平臺(tái)核心類(lèi)庫(kù)的加載。該加載器無(wú)法直接獲取資料
>//3.引導(dǎo)類(lèi)加載器不能直接獲取 ClassLoader parent1 = parent.getParent(); System.out.println("引導(dǎo)類(lèi)加載器 = " + parent1);//nullExtension ClassLoader:負(fù)責(zé)jre/lib/ext目錄下的jar包或者 -D java.ext.dirs指定目錄下的jar包裝入工作庫(kù)
//2.獲取擴(kuò)展類(lèi)加載器 ClassLoader parent = loader.getParent(); System.out.println("擴(kuò)展類(lèi)加載器 = " + parent);System ClassLoader:系統(tǒng)類(lèi)加載器,負(fù)責(zé)java -classpath或者 -D java.class.path所知的目錄下的類(lèi)與jar包裝入工作,是最常用的加載器
//1.獲取系統(tǒng)類(lèi)加載器 ClassLoader loader = ClassLoader.getSystemClassLoader(); System.out.println("系統(tǒng)類(lèi)加載器 = " + loader);獲取某個(gè)實(shí)例的類(lèi)加載器
Person person = new Person(); Class<? extends Person> aClass = person.getClass(); ClassLoader classLoader = aClass.getClassLoader(); System.out.println("Perosn類(lèi)的加載器 = " +classLoader); aClass1 = Class.forName("com.jdy.bean.Dog"); ClassLoader classLoader1 = aClass1.getClassLoader(); System.out.println("Dog類(lèi)的加載器 = " + classLoader1);類(lèi)加載器配合IO
ClassLoader classLoader2 = this.getClass().getClassLoader(); InputStream resourceAsStream = classLoader2.getResourceAsStream("test.properties"); Properties properties = new Properties(); properties.load(resourceAsStream);最后,祝大家早日學(xué)有所成,拿到滿(mǎn)意offer
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的涨薪关键之反射机制,引得项目经理对你的看重,加薪触手可及!!!!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网银密码忘了怎么办
- 下一篇: 因为我把JMM原理讲解了一遍,这给足了我