反射可以解決在編譯時無法預知物件和類別是屬於那個類別的,要根據程式執行時間的資訊才能知道該物件和類別的資訊的問題。
在兩個人協作開發時,你只要知道對方的類別名稱就可以進行初步的開發了。
取得類別物件
Class.forName(String clazzName)靜態方法
呼叫類別的class屬性,Person. class回傳的就是Person的class物件(建議使用)
呼叫某個物件的getClass()方法
具體使用還是要根據實際來選擇,第一種方式是比較自由的,只要知道一個類別名稱就可以了,其不會做該類別是否存在的校驗,第二種、第三種則會做校驗
取得類別的資訊
取得類別建構器
Connstructor<t> getConstructor(Class>.. .parameterTypes)</t>
:傳回此Class物件對應類別的帶有指定形參的public建構器Constructor>[] getConstructors()
:傳回此Class物件對應類別的所有public建構子Constructor<t>[] getDeclaredConstructor(Class>...parameterTypes)</t>
:傳回此class物件對應類別的帶指定參數的建構器,與建構器的存取權限無關#Constructor>[] getDeclaredConstructors()
:傳回此class物件對應類別的所有建構器,與建構器的存取權限無關
取得類別成員方法
Method getMethod (String name,Class>...parameterTypes)
:傳回此class物件對應類別的帶有指定形參的public方法##Method[] getMethods()
:傳回此class物件所表示的類別的所有public方法
Method getDeclaredMethod(string name,Class>...parameterTypes)
:傳回此class物件對應類別的帶指定形參的方法,與方法存取權限無關
#Method[] getDeclaredMethods()
:傳回此class物件對應類別的全部方法,與方法的存取權限無關
Field getField(String name )
:傳回此class物件對應類別的指定名稱的public成員變數
#Field[] getFields()
:傳回此class物件對應類別的所有public成員變數
Field getDeclaredField(String name)
:傳回此class物件對應類別的指定名稱的成員變量,與成員變數存取權限無關
Field[] getDeclaredFields()
:傳回此class物件對應類別的全部成員變量,與成員變數的存取權限無關
A getAnnotation(ClassannotationClass)
:嘗試取得該class物件對應類別上村子的指定類型的Annotation,如果類型註解不存在,則傳回null
A getDeclaredAnnotation(ClassannotationClass)
:這Class)
:這Class是Java 8中新增的,該方法取得直接修飾該class物件對應類別的指定類型的Annotation,如果不存在,則傳回nullAnnotation[] getAnnotations ()
:傳回修飾該class物件對應類別上存在的所有Annotation#Annotation[] getDeclaredAnnotations()
:傳回修飾該Class物件對應類所有存在的Annotation<a extends annotation>A[] getAnnotationByType(Class</a><a>annotationClass)</a>
:此方法的功能與前面介紹的getAnnotation ()方法基本上相似,但由於Java8增加了重複註解功能,因此需要使用該方法來取得修飾該類別的指定類型的多個Annotation<a extends annotation>A[] getDeclaredAnnotationByType(Class</a><a>annotationClass)</a>
:此方法發功能與前面介紹的getDeclaredAnnotations()方法相似,也是因為Java8的重複註解的功能,需要使用該方法來取得直接修飾該類別的指定類型的多個Annotation
取得該類別內部類別
Class>[] getDeclaredClasses()
:傳回該class隊形對應類別裡所包含的全部內部類別
取得該類別物件所在的外部類別
# Class> getDeclaringClass()
:傳回該Class物件對應類別所在的外部類別
取得該類別物件對應類別所實作的介面
#Class>[] getInterfaces()
:傳回該Class物件對應類別所實作的全部介面
取得該類別物件對應類別所繼承的父類別
#Class super T> getSuperclass()
:傳回該Class物件對應類別的超類別的Class物件
取得該類別物件對應類別的修飾符、所在套件、類別名稱等基本資訊
int getModifiers()
:傳回此類或介面的所有修飾符,修飾符由public、protected、private、final、static、abstract等對應的常數組成,傳回的整數要使用Modifier工具類別的方法來解碼,才可以取得真是的修飾符-
#Package getPackage()
:取得該類別的套件 String getName()
:以字串形式傳回此CLass物件所表示的類別的簡稱
判斷該類別是否為介面、枚舉、註解類型
boolean isAnnotation()
:傳回此class物件是否表示一個註解類型#boolean isAnnotationPresent(Class<?extends Annotation>annotationClass)
:判斷此Class物件是否使用類別Annotation修飾<a href="http://www.php.cn/wiki/60.html" target="_blank"></a>
boolean isAnonymousClass()
匿名類別
- boolean isArray()
- :傳回此class對象是否表示一個
陣列
類別
boolean isEnum()
:傳回此class物件是否表示一個枚舉
#boolean isInterface()
:傳回此class物件是否表示一個介面
boolean isInstance(
Object
public interface Colorable { public void value(); }
public class ClassInfo { public static void main(String[] args) throws NoSuchMethodException, SecurityException { Class<Colorable> cls=Colorable.class; System.out.println(cls.getMethod("value")); System.out.println(cls.isAnnotation()); System.out.println(cls.isInterface()); } }
#public abstract void com.em.Colorable.value() false trueJava8中新增的方法參數反射
int getParameterCount()
Parameter[] getParameters():取得該建構器或方法的所有形參
public class Test { public void getInfo(String str,List<String>list){ System.out.println("成功"); } }
public class ClassInfo { public static void main(String[] args) throws NoSuchMethodException, SecurityException { Class<Test> cls=Test.class; Method med=cls.getMethod("getInfo", String.class,List.class); System.out.println(med.getParameterCount()); Parameter[] params=med.getParameters(); System.out.println(params.length); for(Parameter par:params){ System.out.println(par.getName()); System.out.println(par.getType()); System.out.println(par.getParameterizedType()); } } }######結果# #####
2 2 arg0 class java.lang.String class java.lang.String arg1 interface java.util.List java.util.List<java.lang.String>###反射產生物件############使用Class物件的newInstance()方法建立Class物件的實例,該方法要求要有預設建構器(比較常用) ############先使用Class物件取得指定的Constructor對象,在呼叫Constructor物件的newInstance()方法來建立該Class物件對應類別的實例########## ##反射呼叫方法###############Object invoke(Object obj,Object...args)###:該方法中的obj是執行該方法的主調,後面的args是執行此方法時傳入此方法的實參#########
public class Test { public Test(String str) { System.out.println(str); } public void getInfo(String str){ System.out.println(str); } }
public class ClassInfo { public static void main(String[] args) throws Exception { Class<Test> cls=Test.class; Constructor<Test>construct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); Method med=cls.getMethod("getInfo", String.class); med.invoke(test, "调用方法成功"); } }######結果######
初始化 调用方法成功###接下來看官仔細看下面的栗子###
public class Test { public Test(String str) { System.out.println(str); } //私有方法 private void getInfo(String str){ System.out.println(str); } }
public class ClassInfo { public static void main(String[] args) throws Exception { Class<Test> cls=Test.class; Constructor<Test>construct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); //为啥使用这个方法呢? Method med=cls.getDeclaredMethod("getInfo", String.class); //为啥使用这个方法呢? med.setAccessible(true); med.invoke(test, "调用方法成功"); } }######結果######
初始化 调用方法成功######setAccessible(boolean flag):將值設為true,指示該Method在使用是應該取消Java語言的存取權限檢查#########存取成員變數值###############getXxx(Object obj)###:取得obj物件的該成員變數的值。此處的Xxx對應8種基本類型,如果該成員變數的型別是###引用###類型的,則去掉Xxx部分###############setXxx(Object obj ,Xxx val)###:將obj物件的該成員變數設定為val值。此處的Xxx對應8中基本類型,如果該成員變數的類型是引用類型,則取消set後面的Xxx###############以上兩個方法可以方法所有的成員變量,包括private的私有成員變數######
public class Test { private int num; public Test(String str) { System.out.println(str); } private void getInfo(String str){ System.out.println(str); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } }
public class ClassInfo { public static void main(String[] args) throws Exception { Class<Test> cls=Test.class; Constructor<Test>construct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); Method med=cls.getDeclaredMethod("getInfo", String.class); med.setAccessible(true); med.invoke(test, "调用方法成功"); Field fld=cls.getDeclaredField("num"); fld.setAccessible(true); fld.setInt(test, 12); System.out.println(fld.getInt(test)); } }######結果######
初始化 调用方法成功 12###操作數組######java.lang.reflect套件下有一個Array類,其可以動態建立數組#########static Object newInstance(Class>componentType,int...length)###:建立一個具有指定的元素類型、指定維度的新數組###
static xxx getXxx(Object array,int index)
:返回array数组中第index个元素。其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为get()
static void setXxx(Object array,int index,xxx val)
:将array数组中低index 个元素的值设为val,其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为set()
public class ArrayInfo { public static void main(String[] args) { Object arrays=Array.newInstance(String.class, 3); Array.set(arrays, 0, "第一个"); Array.set(arrays, 1, "第二个"); Array.set(arrays, 2, "第三个"); System.out.println(Array.get(arrays, 2)); } }
以上是Java反射取得類別和物件資訊的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Java'splatFormIndependecemeansDeveloperScanWriteCeandeCeandOnanyDeviceWithouTrecompOlding.thisAcachivedThroughThroughTheroughThejavavirtualmachine(JVM),WhaterslatesbyTecodeDecodeOdeIntComenthendions,允許univerniverSaliversalComplatibilityAcrossplatss.allospplats.s.howevss.howev

要設置JVM,需按以下步驟進行:1)下載並安裝JDK,2)設置環境變量,3)驗證安裝,4)設置IDE,5)測試運行程序。設置JVM不僅僅是讓其工作,還包括優化內存分配、垃圾收集、性能調優和錯誤處理,以確保最佳運行效果。

toensurejavaplatFormIntence,lofterTheSeSteps:1)compileAndRunyOpplicationOnmultPlatFormSusiseDifferenToSandjvmversions.2)upureizeci/cdppipipelinelikeinkinslikejenkinsorgithikejenkinsorgithikejenkinsorgithikejenkinsorgithike forautomatecross-plateftestesteftestesting.3)

javastandsoutsoutinmoderndevelopmentduetoitsrobustfeatureslikelambdaexpressions,streams,andenhanced concurrencysupport.1)lambdaexpressionssimplifyfunctional promprogientsmangional programmanging,makencodemoreconciseandable.2)

Java的核心特點包括平台獨立性、面向對象設計和豐富的標準庫。 1)面向對象設計通過多態等特性使得代碼更加靈活和可維護。 2)垃圾回收機制解放了開發者的內存管理負擔,但需要優化以避免性能問題。 3)標準庫提供了從集合到網絡的強大工具,但應謹慎選擇數據結構以保持代碼簡潔。

Yes,Javacanruneverywhereduetoits"WriteOnce,RunAnywhere"philosophy.1)Javacodeiscompiledintoplatform-independentbytecode.2)TheJavaVirtualMachine(JVM)interpretsorcompilesthisbytecodeintomachine-specificinstructionsatruntime,allowingthesameJava

jdkincludestoolsfordEveloping and compilingjavacode,whilejvmrunsthecompiledbytecode.1)jdkcontainsjre,編譯器,andutilities.2)

Java的關鍵特性包括:1)面向對象設計,2)平台獨立性,3)垃圾回收機制,4)豐富的庫和框架,5)並發支持,6)異常處理,7)持續演進。 Java的這些特性使其成為開發高效、可維護軟件的強大工具。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3漢化版
中文版,非常好用

Dreamweaver Mac版
視覺化網頁開發工具

禪工作室 13.0.1
強大的PHP整合開發環境