本文由java編程入門欄目為大家詳細(xì)介紹java中的反射機(jī)制,希望可以幫助到對(duì)于此機(jī)制有所不懂的同學(xué)。
java反射
機(jī)制是運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類都能夠知道這個(gè)類的所有屬性和方法(包括私有的);對(duì)于任意一個(gè)對(duì)象,都能調(diào)用他的任意方法和屬性;這種動(dòng)態(tài)獲取信息及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為Java的反射機(jī)制。
用途:
在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類。
在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象。
在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法。
在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法。
生成動(dòng)態(tài)代理。
反射相關(guān)的類
class類
在Java程序中獲得Class對(duì)象通常有如下三種方式:
1.使用Class類的forName(String clazzName)靜態(tài)方法。該方法需要傳入字符串參數(shù),該字符串參數(shù)的值是某個(gè)類的全限定名(必須添加完整包名)。
2.調(diào)用某個(gè)類的class屬性來獲取該類對(duì)應(yīng)的Class對(duì)象。
3.調(diào)用某個(gè)對(duì)象的getClass()方法。該方法是java.lang.Object類中的一個(gè)方法。
Field
Field[] allFields = class2.getDeclaredFields();//獲取class對(duì)象的所有屬性 Field[] publicFields = class2.getFields();//獲取class對(duì)象的public屬性 Field ageField = class2.getDeclaredField("age");//獲取class指定屬性,可以獲得私有屬性 Field desField = class2.getField("des");//獲取class指定的public屬性
Method
Method[] methods = class2.getDeclaredMethods();//獲取class對(duì)象的所有聲明方法 Method[] allMethods = class2.getMethods();//獲取class對(duì)象的所有public方法 包括父類的方法 Method method = class2.getMethod("info", String.class);//返回次Class對(duì)象對(duì)應(yīng)類的、帶指定形參列表的public方法 Method declaredMethod = class2.getDeclaredMethod("info", String.class);//返回次Class對(duì)象對(duì)應(yīng)類的、 帶指定形參列表的方法
Constructor
Constructor<?>[] allConstructors = class2.getDeclaredConstructors();//獲取class對(duì)象的所有聲明構(gòu)造函數(shù) Constructor<?>[] publicConstructors = class2.getConstructors();//獲取class對(duì)象public構(gòu)造函數(shù) Constructor<?> constructor = class2.getDeclaredConstructor(String.class);//獲取指定聲明構(gòu)造函數(shù) Constructor publicConstructor = class2.getConstructor(String.class);//獲取指定聲明的public構(gòu)造函數(shù)
通過反射 生成實(shí)例對(duì)象
1.使用Class對(duì)象的newInstance()方法來創(chuàng)建該Class對(duì)象對(duì)應(yīng)類的實(shí)例。這種方式要求該Class對(duì)象的對(duì)應(yīng)類有默認(rèn)構(gòu)造器,而執(zhí)行newInstance()方法時(shí)實(shí)際上是利用默認(rèn)構(gòu)造器來創(chuàng)建該類的實(shí)例。
2.先使用Class對(duì)象獲取指定的Constructor對(duì)象,再調(diào)用Constructor對(duì)象的newInstance()方法來創(chuàng)建該Class對(duì)象對(duì)應(yīng)類的實(shí)例。通過這種方式可以選擇使用指定的構(gòu)造器來創(chuàng)建實(shí)例。
調(diào)用方法
1.通過Class對(duì)象的getMethods()方法或者getMethod()方法獲得指定方法,返回Method數(shù)組或?qū)ο蟆?/p>
2.調(diào)用Method對(duì)象中的Object invoke(Object obj, Object… args)方法。第一個(gè)參數(shù)對(duì)應(yīng)調(diào)用該方法的實(shí)例對(duì)象,第二個(gè)參數(shù)對(duì)應(yīng)該方法的參數(shù)。
實(shí)例代碼:
反射是什么?
package am; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; import javax.activation.FileDataSource; /** * 反射是什么: * java中的反射:就是在類的加載過程中,發(fā)現(xiàn)類的屬性和方法構(gòu)造方法等信息??梢垣@得類的屬性值,可以調(diào)用類的方法。 * * * 反射獲得類的對(duì)象。 * */ public class Demo01 { public static void main(String[] args) throws Exception{ // 通過反射,獲取類的對(duì)象。 Object obj = create("am.Foo");; Foo foo = (Foo)obj; System.out.println(foo.a); double dou = foo.show(12, "hello"); System.out.println(dou); System.out.println("======================================"); // 獲得類的屬性 showField(obj); System.out.println("======================================"); double a = (double)getFieldValue(obj, "b"); System.out.println(a); System.out.println("========================================"); // 通過反射調(diào)用方法。 Object ob = getMethodValue(obj,"show",new Class[]{int.class,String.class},new Object[]{23,"abc"}); double douValue = (double)ob; System.out.println(douValue); } //通過反射調(diào)用方法,哪個(gè)對(duì)象,什么名稱,參數(shù)類型,參數(shù)值 public static Object getMethodValue(Object obj,String method,Class[] paramType,Object[] param) throws Exception{ Class cla = obj.getClass(); Method me = cla.getDeclaredMethod(method, paramType); Object o = me.invoke(obj, param); return o; } // 獲取類的屬性值: public static Object getFieldValue(Object obj,String name)throws Exception{ Class cla = obj.getClass();// 獲取字節(jié)碼對(duì)象。 Field field = cla.getDeclaredField(name);// 通過屬性的名稱。獲取當(dāng)前屬性。 Object result = field.get(obj); return result; } // 通過反射,可以獲得類的屬性信息以及方法信息。 public static void showField(Object obj){ // java中對(duì)屬性類。 Field 方法類:Method Class cla = obj.getClass(); System.out.println("獲取類名:"+cla.getName()); System.out.println("======================================"); // 獲取類的屬性: Field[] fields = cla.getDeclaredFields();// 獲取公開的屬性。 for(Field field : fields){ System.out.println("獲取類的屬性類型"+field.getType()); System.out.println("獲取類的屬性名稱:"+field.getName()); } System.out.println("======================================"); // 獲取類的方法。 Method[] methods = cla.getDeclaredMethods(); for(Method method : methods){ System.out.println("獲取方法的返回值類型:"+method.getReturnType()); System.out.println("獲取方法名稱:"+method.getName()); System.out.println("獲取方法的參數(shù)類型。"+Arrays.toString(method.getParameterTypes())); } System.out.println("======================================="); // 獲取類的構(gòu)造方法: Constructor[] cons = cla.getDeclaredConstructors(); for(Constructor con : cons){ System.out.println("構(gòu)造方法的名字:"+con.getName()); System.out.println("構(gòu)造方法參數(shù)類型:"+Arrays.toString(con.getParameterTypes())); } } // 如何反射類的實(shí)例。 public static Object create(String name) throws Exception{ // 反射的方法。Class.forName(); Class cla = Class.forName(name); // 如何獲得Object類型對(duì)象。 Object obj = cla.newInstance(); return obj; } } // 模擬類。 class Foo{ int a = 10; double b = 20; public double show(int p,String str){ System.out.println("調(diào)用方法傳入的值是:"+str); return a+b+p; } public Foo(){ } public Foo(int a,int b){ } }
更多相關(guān)學(xué)習(xí)視頻推薦:java視頻教程
? ??? Java ?? ????? ?? ??? ??? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

JDBC ????? ???? ????? ?? ?? ?? ??? ?? ?? ??? ?? ? ?? ??? ?? ?? ?? ??? ???????. 1. ????? ????? Conn.SetAutoCommit (False)?? ??????. 2. ??? ? ????? ?? ?? SQL ??? ?????. 3. ?? ??? ??? ?? Conn.commit ()?? ???? ??? ???? ???? ?? ??? ???? Conn.Rollback ()?? ??????. ???, ? ??? ???? ????, ??? ???? ????, ?? ??? ??? ?? ??? ??? ???? ? ???????. ?? ?? ?? ???? ????? ??? ???? ?? ?? ???? ???? ??? ????? ?? ??? ??? ? ?? ???? ?? ????.

?? ?? ? ?? ???? ???? ?? Java.Time ???? ???? ??????. 2. LocalDate, LocalDateTime ? LocalTime? ?? ?? ??? ??? ?????. 3. () ???? ???? ?? ??? ??? ????. 4. ???/???? ??? ???? ??? ????? ??? ??????. 5. ZonedDateTime ? Zoneid? ???? ???? ??????. 6. DateTimeFormatter? ?? ?? ? ?? ?? ?? ???; 7. ??? ?? ?? ?? ??? ????? ?? ??????. ?? Java? ?? ??? ???? ??? ??? ???? Java.Timeapi ??? ?? ??? ???????.

Pre-FormancetArtUptimeMoryUsage, Quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless sinarios.2.thyvelopecosyste,

Java 's Garbage Collection (GC)? ???? ???? ???? ??????, ?? ? ??? ??? ? ??? ??? ??? ??? ????. 1.GC? ?? ?? (? : ?? ??, ?? ???, ?? ?? ?)?? ??? ???? ????, ?? ? ??? ??? ???? ?????. 2. ?? ???? ????? ????, ?? ?? ??? ??? ???? ?? ??? ??????. 3. ?? ?? ?? ?? : ??? ?? (Eden, S0, S1)? ?? ????? ?????. ??? ??? ?? ? MajorGC? ???? ? ??? ? ????. Metaspace? ??? ?? ???? ?????. 4. JVM? ??? GC ??? ?????. SerialGC? ??? ?? ????? ?????. ParallelGC? ???? ??????. CMS? ?? ???

GO? HTTP ?? ????? ?? ??, ??, ????? IP ? ?? ??? ?? ? ? ????. 1. http.handlerfunc? ???? ????? ????, 2. ??? ???? ?? ?? ??? ?? ??? ??????. ?? ?? ??? ???? ??? ?????? ??? ????? ???? ? ?????. ?? ???? ?? ?? ??, JSON ?? ?? ? ?? ID ??? ?????.

??? htmlinput ??? ???? ??? ???? ????? ??? ??? ?? ??? ???? ???? ? ????. 1. ???, ???, ??, ?? ? ??? ?? ??? ??? ?? ?? ?? ??? ???? ???? ??? ? ???? ??? ? ????. 2. HTML5? ?????? ??? ? ?? ?? ??? ?? ? ??? URL, ??, ?? ? ??? ?? ??? ??? ??????. 3. ?? ?? ? ? ??? ??? ???? ?? ??? ???? ???? ?? ???? ?? ???? ???? ?? ? ? ??? ?? ???????.

GradleisBetTerChoiceFormostNewProjectSduetoitssuperiorflexible, Performance, and ModernToolingsupport.1.Gradle'Sgroovy/kotlindslismoreConcisENDEXPRESSIVETHANMAVEN'SVOSEXML.2.GradleOutsMaveninbuildweedweedweedweedweedweedweedweedweedweedweedweedweedweede

DEFER? ??? ???? ?? ??? ??? ???? ? ?????. ?? ??? ?? ? ? ?? ????, ??? ??? ? ?? ?? (LIFO)? ??? ?????. 1. ?? ??? ??? ? ??? ?????. 2. ?? ??? ?? ??? ??? ????? ?????. 3. ?? ? ?? ?? ??? ? ????. 4. ??? ?????? ??? ??? ???? ?????. 5. ?? ??? ???? ?? ??? ?? ??? ?????. ??? ??? ?? ?? ? ???? ???? ? ????.
