<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
java原始碼----->javac-------------->java位元組碼檔案-------------->java----------------->類物件(所在記憶體空間:元空間,本地記憶體)------------------------new--------->範例化物件------------------gc------------->解除安裝物件
例如:運算元據庫時jdbc用到,還沒有進入記憶體之前,通過類全名,包名+類名,先把這個類給調出來使用,
總結:同一個類載入器載入的檔案在一次程式執行過程中,只會被載入一次,無論使用哪種方式獲得的類物件都是同一個
程式碼範例:
package com.reflect; public class TestReflectPerson { public static void main(String[] args) throws ClassNotFoundException { //1.class.forName() Class class1=Class.forName("com.reflect.Person"); System.out.println(class1); //2.類名.class Class class2=Person.class; System.out.println(class2); //2.物件名.getClass() Class class3=new Person().getClass(); System.out.println(class3); System.out.println(class1==class2); //true System.out.println(class2==class3); //true } }
獲取成員變數 : 取所有:類物件.getDeclaredFields() ,獲取一個:類物件.getDeclaredField()
獲取任意許可權修飾的成員變數獲取設定值,需要使用setAccessible(true)-----暴力反射
成員方法: 類物件.getDeclaredMethods()
執行方法 invoke(Object object ,Object… agrs) (引數個數任意,可有可無)
獲取方法名getName()
構造方法: 類物件.getDeclaredConstructors()
建立物件 newInstance() 優點:省掉獲取構造方法得到物件那一步,但是必須要有無參構造方法
該方法需要實際情況構造方法賦實參
//獲得構造方法物件, Constructor cons1 = pcla.getDeclaredConstructor(String.class, int.class); Person p2 = (Person)cons1.newInstance("李四",19); System.out.println("p2:"+p2.getName());
newInstance()如果是建立無參構造方法去建立物件,可以使用類物件來建立物件,跳過獲得構造方法物件
獲取
獲得類的名稱:getName() 列印出全名:類名+包名
只想列印單獨類名:getSimpleName()
獲取類的成員變數名稱
屬性檔案:內容以等號連線形如k=v,
程式碼範例:
package com.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class TestReflectPerson { public static void main(String[] args) throws Exception { /* //1.class.forName() Class class1=Class.forName("com.reflect.Person"); System.out.println(class1); //2.類名.class Class class2=Person.class; System.out.println(class2); //2.類名.getClass() Class class3=new Person().getClass(); System.out.println(class3); System.out.println(class1==class2); System.out.println(class2==class3);*/ //獲取物件 Class tclass=Class.forName("com.reflect.Person"); //通過類物件獲取成員變數們 Field[] fields = tclass.getDeclaredFields(); System.out.println("獲取Person物件的所有屬性物件"); for (Field field:fields){ System.out.println(field); } //指定獲取Person物件的屬性物件 System.out.println("指定獲取Person物件的屬性物件"); Field age=tclass.getDeclaredField("age"); System.out.println("age:"+age); //通過類物件獲取所有的構造方法 Constructor[] constructors = tclass.getDeclaredConstructors(); System.out.println("獲取Person的所有構造方法物件"); for (Constructor constructor:constructors){ System.out.println(constructor); } //通過類物件獲取無參的構造方法 Constructor constructor = tclass.getDeclaredConstructor(); System.out.println("constructor:"+constructor); //通過類物件獲取有參的構造方法 Constructor constructor1 = tclass.getDeclaredConstructor(String.class,int.class); System.out.println("constructor1:"+constructor1); //通過類物件獲取所有的成員方法 Method[] methods = tclass.getDeclaredMethods(); for (Method method:methods){ System.out.println("method:"+method); } //通過類物件獲取getAge成員方法 Method getAge = tclass.getDeclaredMethod("getAge"); System.out.println("getAge:"+getAge); //通過類物件獲取getAge成員方法 Method setAge = tclass.getDeclaredMethod("setAge", int.class); System.out.println("setAge:"+setAge); } }
獲取成員變數程式碼範例:
package com.reflect; import java.lang.reflect.Field; public class TestField { public static void main(String[] args) throws Exception { Class pcla=Person.class; /*//獲取公共存取許可權的成員變數 Field[] fields = pcla.getFields(); for (Field field:fields){ System.out.println("getFild:"+field); } System.out.println(); //獲取所有存取許可權的成員變數 Field[] fielddes = pcla.getDeclaredFields(); for (Field field:fielddes){ System.out.println("field:"+field); }*/ Field name = pcla.getDeclaredField("name"); System.out.println(name); Person person=new Person(); //暴力反射:獲取任意存取許可權修飾符的安全檢查 name.setAccessible(true); //獲取公共成員變數的值 Object value = name.get(person); System.out.println(value); //獲取任意存取許可權的成員變數的值 Object value2 = name.get(person); System.out.println("value2:"+value2); //設定任意存取許可權的成員變數的值 name.set(person,"張三"); Object value3=name.get(person); System.out.println("name:"+value3); } }
//暴力反射:獲取任意存取許可權修飾符的安全檢查 name.setAccessible(true);
程序:含有自己的主方法,可以依託自己的主方法啟動,叫做程序
執行緒:沒有自己的主方法,需要依賴其他工具來執行
例如:servlet就需要藉助tomcate來執行,tomcate有自己的一個主方法
舉例:在servlet通過藉助工具tomcate來執行時,tomacate執行專案時存取不到類的資源,由此產生了反射
tomcate為什麼拿不到new的物件
詳解:tomcate不可能通過new的方式來呼叫,因為tomacate是先產生寫好的,類是後來寫的,所以tomcate不知道new的物件的是什麼,可以通過包掃描的方式來獲取檔案路徑,但是這樣也無法使用new的方式,由此產生了反射。
ate有自己的一個主方法
舉例:在servlet通過藉助工具tomcate來執行時,tomacate執行專案時存取不到類的資源,由此產生了反射
tomcate為什麼拿不到new的物件?
詳解:tomcate不可能通過new的方式來呼叫,因為tomacate是先產生寫好的,類是後來寫的,所以tomcate不知道new的物件的是什麼,可以通過包掃描的方式來獲取檔案路徑,但是這樣也無法使用new的方式,由此產生了反射。
tomcate想呼叫doGet,doPost的方法時,因為這兩個方法不是靜態的,必須通過new物件才能呼叫,但是tomcate又不能建立物件,所以由此產生反射來獲取檔案
到此這篇關於Java反射機制詳解的文章就介紹到這了,更多相關Java反射內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45