最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

java反射reflection

2022-09-14 09:46 作者:虛云幻仙  | 我要投稿

/**
* reflection反射
* 初次創(chuàng)建某一個(gè)類的對(duì)象時(shí),JVM會(huì)先通過(guò)類加載器ClassLoader將類文件xxx.class從磁盤中加載到內(nèi)存(io操作)
* 在方法區(qū)中將類生成一個(gè)類對(duì)象Class<xxx>對(duì)象,類對(duì)象/Class對(duì)象中有類文件的所有信息,每個(gè)類的Class對(duì)象只生成一個(gè),用來(lái)創(chuàng)建類的所有對(duì)象
* 通過(guò)這個(gè)類的唯一的Class對(duì)象創(chuàng)建類的對(duì)象,當(dāng)?shù)诙渭耙院髣?chuàng)建對(duì)象時(shí),同樣使用這個(gè)Class對(duì)象創(chuàng)建,不再重復(fù)加載類文件
*/

public class TestReflection1 implements Serializable {
? ?//創(chuàng)建一個(gè)類
? ?String name;
? ?public int age;

? ?public TestReflection1(String name, int age) {
? ? ? ?this.name = name;
? ? ? ?this.age = age;
? ?}

? ?private TestReflection1(String name) {
? ? ? ?this.name = name;
? ?}
? ?//私有構(gòu)造器

? ?public TestReflection1(int age) {
? ? ? ?this.age = age;
? ?}

? ?public TestReflection1() {
? ?}

? ?@Override
? ?public String toString() {
? ? ? ?return "TestReflection1{" +
? ? ? ? ? ? ? ?"name='" + name + '\'' +
? ? ? ? ? ? ? ?", age=" + age +
? ? ? ? ? ? ? ?'}';
? ?}
? ? private void printAge(){
? ? ? ?System.out.println(age);
? ?}
? ?//私有方法
? ?public boolean setAge(int a){
? ? ? ?age ?= a;
? ? ? ?return true;
? ?}
}
class GetClass{
? ?public static void main(String[] args) {
? ? ? ?TestReflection1 t1 = new TestReflection1("quan",20);
? ? ? ?//Class對(duì)象在方法區(qū),新的對(duì)象在堆heep,變量t1在棧stack中main棧幀中
? ? ? ?Class<? extends TestReflection1> tClass = t1.getClass();
? ? ? ?//通過(guò)實(shí)例化的對(duì)象.getClass()得到對(duì)象所屬的類的Class對(duì)象,返回類型為Class<? extends 類名>,Class對(duì)象只有一份,所有實(shí)例化對(duì)象調(diào)用.getClass()會(huì)返回同一個(gè)Class對(duì)象
? ? ? ?//每個(gè)實(shí)例化對(duì)象都是由這一個(gè)Class對(duì)象創(chuàng)建的

? ? ? ?System.out.println(tClass);
? ? ? ?//Class對(duì)象.toString() 返回“class 包名.類名”
? ? ? ?System.out.println(tClass.getName());
? ? ? ?//.getName()返回"包名.類名"
? ? ? ?Class<GetClass> getClassClass = GetClass.class;
? ? ? ?//通過(guò)類的靜態(tài)屬性.class得到Class對(duì)象,每個(gè)類都有class靜態(tài)屬性,當(dāng)內(nèi)存中沒有該Class對(duì)象時(shí)JVM會(huì)去磁盤中加載
? ? ? ?try {
? ? ? ? ? ?Class<?> aClass = Class.forName("java.lang.String");
? ? ? ? ? ?//通過(guò)Class類的靜態(tài)方法.forName(String className)得到Class對(duì)象,字符串必須是完整的"包名.類名",返回類型為Class<?>因?yàn)榫幾g時(shí)沒有解析字符串只能用通配符
? ? ? ? ? ?System.out.println(aClass);
? ? ? ?} catch (ClassNotFoundException e) {
? ? ? ? ? ?throw new RuntimeException(e);
? ? ? ?}

? ? ? ?Constructor<?>[] declaredConstructors = tClass.getDeclaredConstructors();
? ? ? ?//Class對(duì)象.getDeclaredConstructors()方法返回構(gòu)造器類數(shù)組Constructor[],declared聲明的,返回的是這個(gè)類中的所有構(gòu)造器類的對(duì)象,包括private等四種訪問(wèn)控制符修飾的所有構(gòu)造器對(duì)象
? ? ? ?for (Constructor<?> c :
? ? ? ? ? ? ? ?declaredConstructors) {
? ? ? ? ? ?System.out.println(c);
? ? ? ?}
? ? ? ?/*結(jié)果
? ? ? ?public TestReflection1()
? ? ? ?public TestReflection1(int)
? ? ? ?private TestReflection1(java.lang.String)
? ? ? ?public TestReflection1(java.lang.String,int)
? ? ? ? */

? ? ? ?Constructor<?>[] constructors = tClass.getConstructors();
? ? ? ?//不加declared的get只返回public的構(gòu)造器
? ? ? ?System.out.println(Arrays.toString(constructors));
? ? ? ?//結(jié)果:[public TestReflection1(), public TestReflection1(int), public TestReflection1(java.lang.String,int)]
? ? ? ?try {
? ? ? ? ? ?Constructor<? extends TestReflection1> declaredConstructor = tClass.getDeclaredConstructor(int.class);
? ? ? ? ? ?//不加s的get返回單個(gè)構(gòu)造器,需要傳入Class<?>...p可變參數(shù)對(duì)應(yīng)構(gòu)造器的形參類型,這里傳入的是int.class即int的Class對(duì)象,返回只傳一個(gè)int參數(shù)的構(gòu)造器
? ? ? ? ? ?System.out.println(declaredConstructor);
? ? ? ? ? ?//結(jié)果:public TestReflection1(int)
// ? ? ? ? ? ?System.out.println(tClass.getConstructor(String.class));
? ? ? ? ? ?//不加declared不加s,只查找public的構(gòu)造器,但TestReflection1(String name)是private的,所以找不到傳參為String的構(gòu)造器,拋出異常java.lang.NoSuchMethodException: TestReflection1.<init>(java.lang.String)

? ? ? ? ? ?System.out.println(tClass.getConstructor(null));
? ? ? ? ? ?//只傳null對(duì)應(yīng)無(wú)參構(gòu)造器,結(jié)果為:public TestReflection1() ,idea提示將null改為(Class<?>)null
// ? ? ? ? ? ?System.out.println(tClass.getConstructor(int.class,String.class));
? ? ? ? ? ?//參數(shù)順序和構(gòu)造器形參順序不同也會(huì)報(bào)錯(cuò),形參順序不同可以構(gòu)成重載

? ? ? ? ? ?Constructor<? extends TestReflection1> constructor = tClass.getConstructor(String.class, int.class);
? ? ? ? ? ?TestReflection1 yang = constructor.newInstance("yang", 20);
? ? ? ? ? ?//構(gòu)造器對(duì)象.newInstance(Object...args)方法會(huì)生成新的對(duì)象,要求傳入的參數(shù)和構(gòu)造器的形參類型一致
? ? ? ?} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
? ? ? ? ? ?throw new RuntimeException(e);
? ? ? ?}
? ? ? ?Field[] fields = tClass.getFields();
? ? ? ?//.getFields()方法返回public的屬性Field[]數(shù)組,和構(gòu)造器對(duì)象一樣,屬性也是對(duì)象,這里的Field指成員變量,屬于對(duì)象,不包含屬于類的靜態(tài)變量
? ? ? ?System.out.println(Arrays.toString(fields));
? ? ? ?//結(jié)果為:[public int TestReflection1.age]
? ? ? ?for (Field declaredField : tClass.getDeclaredFields()) {
? ? ? ? ? ?//加Declared忽略訪問(wèn)控制符,返回所有Field
? ? ? ? ? ?System.out.print(declaredField.getName()+"\t");
? ? ? ? ? ?//.getName()返回屬性的名字,結(jié)果:name ? ? age
? ? ? ?}
? ? ? ?try {
? ? ? ? ? ?Field age = tClass.getField("age");
? ? ? ? ? ?//不加s返回單個(gè),查找和傳參的字符串名字一致的屬性,public的屬性
? ? ? ? ? ?System.out.println(age);
? ? ? ? ? ?//結(jié)果:public int TestReflection1.age
? ? ? ? ? ?System.out.println(tClass.getDeclaredField("name"));
? ? ? ? ? ?//加declared忽略訪問(wèn)控制符
? ? ? ? ? ?TestReflection1 t2 = tClass.newInstance();
? ? ? ? ? ?//通過(guò)Class對(duì)象.newInstance()創(chuàng)建無(wú)參的實(shí)例
? ? ? ? ? ?age.set(t2,23);
? ? ? ? ? ?//Field對(duì)象.set(類的對(duì)象,值) 用于設(shè)定指定類的對(duì)象的成員變量的值,上面通過(guò).getField("age")得到了age屬性的Field對(duì)象,引用變量為age
? ? ? ? ? ?//通過(guò)Field對(duì)象age.set對(duì)指定t2的屬性age的值進(jìn)行設(shè)定,設(shè)定的值的類型同樣需要小于等于屬性的類型

? ? ? ? ? ?System.out.println(age.get(t2));
? ? ? ? ? ?//Field對(duì)象.get(類的對(duì)象)返回指定對(duì)象的成員變量的值,使用age.get()會(huì)返回age屬性的值,傳參t2會(huì)返回t2對(duì)象的age屬性的值,返回值類型為Object
? ? ? ? ? ?age.setInt(t2,24);
? ? ? ? ? ?int i = age.getInt(t2);
? ? ? ? ? ?//使用指定具體類型的set、get,setInt要求參數(shù)為int類型,getInt返回int類型參數(shù)而不是Object
? ? ? ? ? ?//對(duì)于屬性的使用和正常通過(guò)對(duì)象調(diào)用一樣,受訪問(wèn)控制符的限制,在類外不能查改private屬性(除非關(guān)閉安全檢查)

? ? ? ?} catch (NoSuchFieldException | IllegalAccessException | InstantiationException e) {
? ? ? ? ? ?throw new RuntimeException(e);
? ? ? ?}

? ? ? ?Method[] methods = tClass.getMethods();
? ? ? ?//.getMethods()返回所有public修飾的普通方法對(duì)象數(shù)組Method[]
? ? ? ?for (Method m :
? ? ? ? ? ? ? ?methods) {
? ? ? ? ? ?System.out.println(m);
? ? ? ?}
? ? ? ?//繼承的public方法也會(huì)返回,比如繼承Object類的public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
? ? ? ?System.out.println(Arrays.toString(tClass.getDeclaredMethods()));
? ? ? ?//返回類內(nèi)聲明的所有方法,declared聲明,通過(guò)繼承得到的但是類內(nèi)沒有聲明的方法不會(huì)返回
? ? ? ?// 結(jié)果為:[public java.lang.String TestReflection1.toString(), private void TestReflection1.printAge(), public boolean TestReflection1.setAge(int)]
? ? ? ?// 返回內(nèi)容中有toString是因?yàn)橹貙懥藅oString方法

? ? ? ?try {
? ? ? ? ? ?Method method1 = tClass.getMethod("setAge", int.class);
? ? ? ? ? ?//.getMethod(String name,Class<?>...types)和getConstructor()方法類似,需要指定方法名和形參列表,只能查找public修飾的方法
? ? ? ? ? ?System.out.println(method1.getName());
? ? ? ? ? ?//.getName()返回方法名,結(jié)果:setAge
? ? ? ? ? ?System.out.println(tClass.getDeclaredMethod("printAge"));
? ? ? ? ? ?//加declared忽略訪問(wèn)控制符,無(wú)參方法只傳方法名
? ? ? ? ? ?TestReflection1 t3 = tClass.newInstance();
? ? ? ? ? ?Method setAge = tClass.getDeclaredMethod("setAge",int.class);
? ? ? ? ? ?Method printAge = tClass.getDeclaredMethod("printAge");
? ? ? ? ? ?Object a = setAge.invoke(t3, 23);
? ? ? ? ? ?//Method方法對(duì)象.invoke(類的對(duì)象,對(duì)應(yīng)形參的參數(shù)值),調(diào)用哪個(gè)方法對(duì)哪個(gè)對(duì)象。invoke調(diào)用,返回的是方法的返回值,setAge()方法返回boolean,向上轉(zhuǎn)換為Object返回
? ? ? ? ? ?System.out.println(a);
? ? ? ? ? ?//結(jié)果:true
// ? ? ? ? ? ?Object pr = printAge.invoke(t3);
? ? ? ? ? ?//對(duì)t3調(diào)用printAge方法,無(wú)參數(shù),方法聲明void時(shí)invoke()返回null,但由于printAge()方法為private,調(diào)用時(shí)拋異常java.lang.IllegalAccessException: Class GetClass can not access a member of class TestReflection1 with modifiers "private"

? ? ? ? ? ?printAge.setAccessible(true);
? ? ? ? ? ?//通過(guò).setAccessible(true)關(guān)閉安全檢查,設(shè)為true后JVM不再對(duì)該對(duì)象的調(diào)用檢查訪問(wèn)控制符
? ? ? ? ? ?Object pr = printAge.invoke(t3);
? ? ? ? ? ?//不再報(bào)錯(cuò),accessible可使用的,默認(rèn)setAccessible(false)開啟安全檢查,受到訪問(wèn)控制符修飾的屬性、方法、構(gòu)造器等對(duì)象均可以通過(guò)setAccessible(true)關(guān)閉安全檢查
? ? ? ?} catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
? ? ? ? ? ?throw new RuntimeException(e);
? ? ? ?}

? ? ? ?String n = tClass.getName();
? ? ? ?//.getName()返回 包名.類名
? ? ? ?Package aPackage = String.class.getPackage();
? ? ? ?//.getPackage()返回包對(duì)象
? ? ? ?System.out.println(aPackage);
? ? ? ?//結(jié)果:package java.lang, Java Platform API Specification, version 1.8
? ? ? ?System.out.println(aPackage.getName());
? ? ? ?//結(jié)果:java.lang
? ? ? ?System.out.println(tClass.getSimpleName());
? ? ? ?//.getSimpleName()返回不含包名的類名
? ? ? ?Class<?> superclass = tClass.getSuperclass();
? ? ? ?//.getSuperclass()返回父類
? ? ? ?System.out.println(superclass);
? ? ? ?//結(jié)果為:class java.lang.Object
? ? ? ?Class<?>[] interfaces = tClass.getInterfaces();
? ? ? ?//.getInterfaces()返回當(dāng)前類所實(shí)現(xiàn)的所有接口的Class對(duì)象數(shù)組
? ? ? ?System.out.println(Arrays.toString(interfaces));
? ? ? ?//結(jié)果為:[interface java.io.Serializable]
? ?}
}

java反射reflection的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
中宁县| 中卫市| 马公市| 大悟县| 明溪县| 于田县| 开阳县| 巴南区| 安陆市| 云浮市| 永顺县| 墨脱县| 明水县| 遂川县| 漠河县| 昌江| 昌宁县| 桓仁| 略阳县| 邹城市| 湛江市| 南澳县| 松江区| 长阳| 五台县| 昌黎县| 太和县| 玉屏| 综艺| 巴彦淖尔市| 布尔津县| 阳原县| 江门市| 龙海市| 锡林郭勒盟| 仁化县| 怀来县| 绥芬河市| 霍邱县| 宜阳县| 甘泉县|