摘要:反射可以解決在編譯時無法預(yù)知對象和類是屬于那個類的,要根據(jù)程序運行時的信息才能知道該對象和類的信息的問題。此處的對應(yīng)種基本類型,如果該成員變量的類型是引用類型的,則去掉部分將對象的該成員變量設(shè)置為值。
反射可以解決在編譯時無法預(yù)知對象和類是屬于那個類的,要根據(jù)程序運行時的信息才能知道該對象和類的信息的問題。
在兩個人協(xié)作開發(fā)時,你只要知道對方的類名就可以進行初步的開發(fā)了。
獲取類對象Class.forName(String clazzName)靜態(tài)方法
調(diào)用類的class屬性,Person.class返回的就是Person的class對象(推薦使用)
調(diào)用某個對象的getClass()方法
獲取類的信息具體使用還是要根據(jù)實際來選擇,第一種方式是比較自由的,只要知道一個類名就可以了,其不會做該類是否存在的校驗,第二種、第三種則會做校驗
Connstructor
Constructor>[] getConstructors():返回此Class對象對應(yīng)類的所有public構(gòu)造器
Constructor
Constructor>[] getDeclaredConstructors():返回此class對象對應(yīng)類的所有構(gòu)造器,與構(gòu)造器的訪問權(quán)限無關(guān)
Method getMethod(String name,Class>...parameterTypes):返回此class對象對應(yīng)類的帶指定形參的public方法
Method[] getMethods():返回此class對象所表示的類的所有public方法
Method getDeclaredMethod(string name,Class>...parameterTypes):返回此class對象對應(yīng)類的帶指定形參的方法,與方法訪問權(quán)限無關(guān)
Method[] getDeclaredMethods():返回此class對象對應(yīng)類的全部方法,與方法的訪問權(quán)限無關(guān)
Field getField(String name):返回此class對象對應(yīng)類的指定名稱的public成員變量
Field[] getFields():返回此class對象對應(yīng)類的所有public成員變量
Field getDeclaredField(String name):返回此class對象對應(yīng)類的指定名稱的成員變量,與成員變量訪問權(quán)限無關(guān)
Field[] getDeclaredFields():返回此class對象對應(yīng)類的全部成員變量,與成員變量的訪問權(quán)限無關(guān)
A getAnnotation(ClassannotationClass):嘗試獲取該class對象對應(yīng)類上村子的指定類型的Annotation,如果該類型注解不存在,則返回null
A getDeclaredAnnotation(ClassannotationClass):這是Java 8中新增的,該方法獲取直接修飾該class對象對應(yīng)類的指定類型的Annotation,如果不存在,則返回null
Annotation[] getAnnotations():返回修飾該class對象對應(yīng)類上存在的所有Annotation
Annotation[] getDeclaredAnnotations():返回修飾該Class對象對應(yīng)類上存在的所有Annotation
A[] getAnnotationByType(ClassannotationClass):該方法的功能與前面介紹的getAnnotation()方法基本相似,但由于Java8增加了重復(fù)注解功能,因此需要使用該方法獲取修飾該類的指定類型的多個Annotation
A[] getDeclaredAnnotationByType(ClassannotationClass):該方法發(fā)功能與前面介紹的getDeclaredAnnotations()方法相似,也是因為Java8的重復(fù)注解的功能,需要使用該方法獲取直接修飾該類的指定類型的多個Annotation
Class>[] getDeclaredClasses():返回該class隊形對應(yīng)類里包含的全部內(nèi)部類
Class> getDeclaringClass():返回該Class對象對應(yīng)類所在的外部類
Class>[] getInterfaces():返回該Class對象對應(yīng)類所實現(xiàn)的全部接口
Class super T> getSuperclass():返回該Class對象對應(yīng)類的超類的Class對象
int getModifiers():返回此類或接口的所有修飾符,修飾符由public、protected、private、final、static、abstract等對應(yīng)的常量組成,返回的整數(shù)應(yīng)使用Modifier工具類的方法來解碼,才可以獲取真是的修飾符
Package getPackage():獲取該類的包
String getName():以字符串形式返回此CLass對象所表示的類的簡稱
boolean isAnnotation():返回此class對象是否表示一個注解類型
boolean isAnnotationPresent(Class extends Annotation>annotationClass):判斷此Class對象是否使用類Annotation修飾
boolean isAnonymousClass():返回此class對象是否是一個匿名類
boolean isArray():返回此class對象是否表示一個數(shù)組類
boolean isEnum():返回此class對象是否表示一個枚舉
boolean isInterface():返回此class對象是否表示一個接口
boolean isInstance(Object obj):判斷obj是否是此class對象的實例,該方法可以完全代替instanceof操作符
public interface Colorable { public void value(); }
public class ClassInfo { public static void main(String[] args) throws NoSuchMethodException, SecurityException { Classcls=Colorable.class; System.out.println(cls.getMethod("value")); System.out.println(cls.isAnnotation()); System.out.println(cls.isInterface()); } }
結(jié)果
public abstract void com.em.Colorable.value() false trueJava8中新增的方法參數(shù)反射
int getParameterCount():獲取該構(gòu)造器或方法的形參個數(shù)
Parameter[] getParameters():獲取該構(gòu)造器或方法的所有形參
getModifiers():獲取修飾該形參的修飾符
String getName():獲取形參名
Type getParameterizedType():獲取帶泛型的形參類型
Class>getType():獲取形參類型
boolean isNamePresent():該方法返回該類的class文件中是否包含了方法的形參名信息
boolean isVarArgs():該方法用于判斷該參數(shù)是否為個數(shù)可變的形參
public class Test { public void getInfo(String str,Listlist){ System.out.println("成功"); } }
public class ClassInfo { public static void main(String[] args) throws NoSuchMethodException, SecurityException { Classcls=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()); } } }
結(jié)果
2 2 arg0 class java.lang.String class java.lang.String arg1 interface java.util.List java.util.List反射生成對象
使用Class對象的newInstance()方法創(chuàng)建Class對象的實例,該方法要求要有默認(rèn)構(gòu)造器(比較常用)
先使用Class對象獲取指定的Constructor對象,在調(diào)用Constructor對象的newInstance()方法來創(chuàng)建該Class對象對應(yīng)類的實例
反射調(diào)用方法Object invoke(Object obj,Object...args):該方法中的obj是執(zhí)行該方法的主調(diào),后面的args是執(zhí)行該方法時傳入該方法的實參
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 { Classcls=Test.class; Constructor construct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); Method med=cls.getMethod("getInfo", String.class); med.invoke(test, "調(diào)用方法成功"); } }
結(jié)果
初始化 調(diào)用方法成功
接下來看官仔細(xì)看下面的栗子
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 { Classcls=Test.class; Constructor construct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); //為啥使用這個方法呢? Method med=cls.getDeclaredMethod("getInfo", String.class); //為啥使用這個方法呢? med.setAccessible(true); med.invoke(test, "調(diào)用方法成功"); } }
結(jié)果
初始化 調(diào)用方法成功
訪問成員變量值setAccessible(boolean flag):將值設(shè)為true,指示該Method在使用是應(yīng)該取消Java語言的訪問權(quán)限檢查
getXxx(Object obj):獲取obj對象的該成員變量的值。此處的Xxx對應(yīng)8種基本類型,如果該成員變量的類型是引用類型的,則去掉Xxx部分
setXxx(Object obj,Xxx val):將obj對象的該成員變量設(shè)置為val值。此處的Xxx對應(yīng)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 { Classcls=Test.class; Constructor construct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); Method med=cls.getDeclaredMethod("getInfo", String.class); med.setAccessible(true); med.invoke(test, "調(diào)用方法成功"); Field fld=cls.getDeclaredField("num"); fld.setAccessible(true); fld.setInt(test, 12); System.out.println(fld.getInt(test)); } }
結(jié)果
初始化 調(diào)用方法成功 12操作數(shù)組
java.lang.reflect包下有一個Array類,其可以動態(tài)創(chuàng)建數(shù)組
static Object newInstance(Class>componentType,int...length):創(chuàng)建一個具有指定的元素類型、指定維度的新數(shù)組
static xxx getXxx(Object array,int index):返回array數(shù)組中第index個元素。其中xxx是各種基本數(shù)據(jù)類型,如果數(shù)組元素是引用類型,則該方法變?yōu)間et()
static void setXxx(Object array,int index,xxx val):將array數(shù)組中低index 個元素的值設(shè)為val,其中xxx是各種基本數(shù)據(jù)類型,如果數(shù)組元素是引用類型,則該方法變?yōu)閟et()
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)); } }
更多內(nèi)容可以關(guān)注微信公眾號,或者訪問AppZone網(wǎng)站
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64783.html
摘要:反射機制一結(jié)合官方通過編寫的反射教程,復(fù)習(xí)一下反射的知識。反射的概念反射是一種在運行時獲取以及修改應(yīng)用行為的一種工具。因為反射需要動態(tài)的解析類的信息,相比于非反射使用的方式要慢。反射需要獲取一定的運行時權(quán)限,在特定的安全環(huán)境下不一定存在。 Java反射機制(一) 結(jié)合Oracle官方通過JDK8編寫的反射教程,復(fù)習(xí)一下反射的知識。結(jié)尾篇補一個小例子。 主要內(nèi)容 這次博客的主要內(nèi)容就是簡...
摘要:使用反射可以在運行時檢視類。類名類修飾符等包信息超類所實現(xiàn)的接口構(gòu)造函數(shù)方法屬性注解類中附加了很多信息,你可以在獲得一個完整列表。全限定名包含所有的包名。構(gòu)造函數(shù)你可以訪問類的構(gòu)造函數(shù),代碼如下構(gòu)造函數(shù)的詳細(xì)教程在章節(jié)。 使用反射可以在運行時檢視Java類。檢視類通常是使用反射時所做的第一件事情。從類中可以獲得下面的信息。 類名 類修飾符(private、public、synchro...
摘要:面試通關(guān)要點匯總集部分解答說明如果你有幸能看到的話,本文整體框架來自阿里梁桂釗的博文,總結(jié)的非常不錯。這樣做的目的是對內(nèi)部數(shù)據(jù)進行了不同級別的保護,防止錯誤的使用了對象的私有部分。被繼承的類稱為基類和父類或超類。 showImg(https://segmentfault.com/img/remote/1460000013442471?w=1280&h=819); Java面試通關(guān)要點匯...
閱讀 3797·2021-09-23 11:32
閱讀 2463·2021-09-06 15:01
閱讀 1623·2021-08-18 10:24
閱讀 3458·2019-12-27 11:44
閱讀 3609·2019-08-30 15:52
閱讀 2518·2019-08-30 11:11
閱讀 689·2019-08-29 17:27
閱讀 605·2019-08-29 16:22