日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java 反射详解

發(fā)布時(shí)間:2025/4/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 反射详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

反射(Reflection)是Java 程序開(kāi)發(fā)語(yǔ)言的特征之一,它允許運(yùn)行中的 Java 程序獲取自身的信息,并且可以操作類或?qū)ο蟮膬?nèi)部屬性  

?

與反射有關(guān)的類包.

java.lang.reflect.*;

java.lang.Class;

?

下面來(lái)看反射到底能做什么:

?

  • 獲取Class對(duì)象 1).Object.getCalss(); 2).Class.forName(String)(String的寫法:包名.類名.就會(huì)創(chuàng)建包名.類名對(duì)應(yīng)的那個(gè)對(duì)象)( 注:1.2只適用于引用類型) 3).封裝類.TYPE返回對(duì)應(yīng)的基本類型的Class對(duì)象.Integer.TYPE對(duì)應(yīng)的是int的Class對(duì)象注:3只適用于基本類型 4).類型.Class。注:4是通用的上面的4種方法,只有方法2是動(dòng)態(tài)的,只要換一個(gè)包就可以了.它具有動(dòng)態(tài)潛質(zhì).所以真正意義的想體現(xiàn)動(dòng)態(tài)編程只能使用方法2. eg: 1 package com.company; 2 3 public class Main { 4 public static void main(String[] args) throws Exception { 5 Person person = new Person("batty"); 6 /* clazz 是儲(chǔ)存Person類內(nèi)容(constructor、field、method等)的類 7 也就是說(shuō),Class是儲(chǔ)存類信息的類 8 */ 9 Class clazz = Class.forName("com.company.Person"); 10 System.out.println("person.getClass(): " + person.getClass()); // class com.company.Person 11 System.out.println("clazz.getClass(): " + clazz.getClass()); // class java.lang.Class 12 System.out.println("clazz.getName(): " + clazz.getName()); // com.company.Person 13 System.out.println("clazz.getClass().getName(): " + clazz.getClass().getName()); // java.lang.Class 14 System.out.println("person.getClass(): "+ person.getClass()); // class com.company.Person 15 System.out.println("Class.forName(\"Person\"): " + Class.forName("com.company.Person")); // class com.company.Person 16 System.out.println("String.TYPE " + Integer.TYPE); // int 17 System.out.println("person.class: " + Person.class); // class com.company.Person 18 } 19 } 20 class Person{ 21 String name; 22 Person(String name) { 23 this.name = name; 24 } 25 }

    ?

  • 獲取類中的構(gòu)造函數(shù) [獲取構(gòu)造<根據(jù)參數(shù)類型>](使用時(shí)一般用不帶declared的,即藍(lán)色字體) Constructor<T> getConstructor(Class<?>... parameterTypes) 返回一個(gè) Constructor 對(duì)象,它反映此 Class 對(duì)象所表示的類的指定公共構(gòu)造方法。 Constructor<?>[] getConstructors() 返回一個(gè)包含某些 Constructor 對(duì)象的數(shù)組,這些對(duì)象反映此 Class 對(duì)象所表示的類的所有公共構(gòu)造方法。 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回一個(gè) Constructor 對(duì)象,該對(duì)象反映此 Class 對(duì)象所表示的類或接口的指定構(gòu)造方法。 Constructor<?>[] getDeclaredConstructors() 返回 Constructor 對(duì)象的一個(gè)數(shù)組,這些對(duì)象反映此 Class 對(duì)象表示的類聲明的所有構(gòu)造方法。

    ?具體使用例子:利用反射調(diào)用構(gòu)造函數(shù)

    1 package Reflect; 2 import java.lang.reflect.Constructor; 3 class Demo() { 4 String name; 5 Demo() {} 6 Demo(String name) { 7 this.name = name; 8 } 9 @Override 10 String toString(){ 11 return "["+this.name+"]"; 12 } 13 } 14 public class test() { 15 public static void main(String[] args) { 16 Class<?> test = null; 17 try { 18 test = Class.forName(Reflect.Demo); 19 } catch (Exception e) { 20 e.printStackTrace(); 21 } 22 Demo d1 = null; 23 Demo d2 = null; 24 Constructor<?> cons[]=test.getConstructors(); 25 try { 26 d1=(Demo)cons[0].newInstance(); 27 d2=(Demo)cons[1].newInstance("TestDemo"); 28 } catch(Exception e){ 29 e.printStackTrace(); 30 } 31 System.out.println(d1); 32 System.out.println(d2); 33 } 34 }

    ?

  • 獲取類中的成員函數(shù)(method) [獲取方法<方法名加上參數(shù)類型>](使用時(shí)一般用不帶declared的,即藍(lán)色字體) Method getMethod(String name, Class<?>... parameterTypes) 返回一個(gè) Method 對(duì)象,它反映此 Class 對(duì)象所表示的類或接口的指定公共成員方法。 Method[] getMethods() 返回一個(gè)包含某些 Method 對(duì)象的數(shù)組,這些對(duì)象反映此 Class 對(duì)象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共 member 方法。 Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回一個(gè) Method 對(duì)象,該對(duì)象反映此 Class 對(duì)象所表示的類或接口的指定已聲明方法。 Method[] getDeclaredMethods() 返回 Method 對(duì)象的一個(gè)數(shù)組,這些對(duì)象反映此 Class 對(duì)象表示的類或接口聲明的所有方法,包括公共、保護(hù)、默認(rèn)(包)訪問(wèn)和私有方法,但不包括繼承的方法。

    具體使用例子:利用反射調(diào)用方法
    1 package Reflect; 2 import java.lang.reflect.Constructor; 3 class Demo() { 4 String name; 5 Demo() {} 6 Demo(String name) { 7 this.name = name; 8 } 9 void demoTest(String name) { 10 System.out.println(this.name); 11 } 12 @Override 13 String toString(){ 14 return "["+this.name+"]"; 15 } 16 } 17 public class test() { 18 public static void main(String[] args) { 19 Class<?> test = null; 20 try { 21 test = Class.forName(Reflect.Demo); 22 } catch (Exception e) { 23 e.printStackTrace(); 24 } 25 try{ 26 //調(diào)用Person類中的sayChina方法 27 Method method = test.getMethod("demoTest"); 28 method.invoke(test.newInstance()); 29 }catch (Exception e) { 30 e.printStackTrace(); 31 } 32 } 33 }

    ?

  • 獲取類中的成員變量(field) [獲取屬性<根據(jù)屬性名>](使用時(shí)一般用是帶declared的,即藍(lán)色字體,因?yàn)閷傩砸话愣际撬接械? Field getField(String name) 返回一個(gè) Field 對(duì)象,它反映此 Class 對(duì)象所表示的類或接口的指定公共成員字段。 Field[] getFields() 返回一個(gè)包含某些 Field 對(duì)象的數(shù)組,這些對(duì)象反映此 Class 對(duì)象所表示的類或接口的所有可訪問(wèn)公共字段。 Field getDeclaredField(String name) 返回一個(gè) Field 對(duì)象,該對(duì)象反映此 Class 對(duì)象所表示的類或接口的指定已聲明字段。 Field[] getDeclaredFields() 返回 Field 對(duì)象的一個(gè)數(shù)組,這些對(duì)象反映此 Class 對(duì)象所表示的類或接口所聲明的所有字段。

    ?有declared的方法是支持私有,但是不支持繼承,無(wú)declared的方法支持繼承,不支持私有,且只能取出public的東西。

    ?因此取屬性的時(shí)候一般來(lái)說(shuō)是帶declared的,因?yàn)閷傩砸话愣际撬接械?取方法時(shí)一般是不帶declared的,取構(gòu)造時(shí)一般也是不帶declared的.

    ?

    具體使用例子:利用反射獲取字段field

    1 package Reflect; 2 import java.lang.reflect.Constructor; 3 class Demo() { 4 String name; 5 Demo() {} 6 Demo(String name) { 7 this.name = name; 8 } 9 @Override 10 String toString(){ 11 return "["+this.name+"]"; 12 } 13 } 14 public class test() { 15 public static void main(String[] args) { 16 Class<?> test = null; 17 try { 18 test = Class.forName(Reflect.Demo); 19 } catch (Exception e) { 20 e.printStackTrace(); 21 } 22 // 取得本類的全部屬性 23 Field[] field = test.getDeclaredFields(); 24 for (int i = 0; i < field.length; i++) { 25 // 權(quán)限修飾符 26 int mo = field[i].getModifiers(); 27 String priv = Modifier.toString(mo); 28 // 屬性類型 29 Class<?> type = field[i].getType(); 30 System.out.println(priv + " " + type.getName() + " " 31 + field[i].getName() + ";"); 32 } 33 } 34 }

    ?

  • ?寫個(gè)博客寫了大半個(gè)月了,現(xiàn)在才想起把這篇寫完發(fā)布出去,我的第一篇博客就這樣誕生了。。。。。。。。。。。。。。。。。。

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/luxurytime/p/9115130.html

    總結(jié)

    以上是生活随笔為你收集整理的java 反射详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。