列舉java語言中反射的常用方法及實(shí)例代碼
Java反射機(jī)制
一、什么是反射機(jī)制
簡單的來說,反射機(jī)制指的是程序在運(yùn)行時(shí)能夠獲取自身的信息。在java中,只要給定類的名字,
那么就可以通過反射機(jī)制來獲得類的所有信息。
二、哪里用到反射機(jī)制
有些時(shí)候,我們用過一些知識(shí),但是并不知道它的專業(yè)術(shù)語是什么,在剛剛學(xué)jdbc時(shí)用過一行代碼,
Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那時(shí)候只知道那行代碼是生成
驅(qū)動(dòng)對象實(shí)例,并不知道它的具體含義。聽了反射機(jī)制這節(jié)課后,才知道,原來這就是反射,現(xiàn)在很多開
框架都用到反射機(jī)制,hibernate、struts都是用反射機(jī)制實(shí)現(xiàn)的。
三、反射機(jī)制的優(yōu)點(diǎn)與缺點(diǎn)
為什么要用反射機(jī)制?直接創(chuàng)建對象不就可以了嗎,這就涉及到了動(dòng)態(tài)與靜態(tài)的概念,
靜態(tài)編譯:在編譯時(shí)確定類型,綁定對象,即通過。
動(dòng)態(tài)編譯:運(yùn)行時(shí)確定類型,綁定對象。動(dòng)態(tài)編譯最大限度發(fā)揮了java的靈活性,體現(xiàn)了多
態(tài)的應(yīng)用,有以降低類之間的藕合性。
一句話,反射機(jī)制的優(yōu)點(diǎn)就是可以實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建對象和編譯,體現(xiàn)出很大的靈活性,特別是在J2EE的開發(fā)中它的靈活性就表現(xiàn)的十分明顯。比如,一個(gè)大型的軟件,不可能一次就把把它設(shè)計(jì)的很完美,當(dāng)這個(gè)程序編譯后,發(fā)布了,當(dāng)發(fā)現(xiàn)需要更新某些功能時(shí),我們不可能要用戶把以前的卸載,再重新安裝新的版本,假如這樣的話,這個(gè)軟件肯定是沒有多少人用的。采用靜態(tài)的話,需要把整個(gè)程序重新編譯一次才可以實(shí)現(xiàn)功能的更新,而采用反射機(jī)制的話,它就可以不用卸載,只需要在運(yùn)行時(shí)才動(dòng)態(tài)的創(chuàng)建和編譯,就可以實(shí)現(xiàn)該功能。
它的缺點(diǎn)是對性能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什么并且它
滿足我們的要求。這類操作總是慢于只直接執(zhí)行相同的操作。
列舉java語言中反射的常用方法
package review;/*12:43 2019/7/21*/ import model.AnotherClass; import model.OneClassMore; import model.SomeClass; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 這個(gè)類列舉了java語言中關(guān)于反射機(jī)制的常用的一些方法 * @author zhangxingshuo */ public class AboutReflection { public static void main(String[] args) throws Exception { } /*獲得Class對象的3種方式*/ private static Class<?> getClazz0(String className) throws ClassNotFoundException { Class clazz=Class.forName(className); return clazz; } private static Class<?> getClazz1(Object object) { Class clazz=object.getClass(); return clazz; } private static Class<?> getClazz2() { Class clazz=model.SomeClass.class; return clazz; } /*經(jīng)常使用的Class對象的3個(gè)方法*/ private static String useClazz0(Class clazz) { String fullyQualifiedName=clazz.getName(); return fullyQualifiedName; } private static String useClazz1(Class clazz) { String className=clazz.getSimpleName(); return className; } //ex:private //ex:abstract private static Object useClazz2(Class clazz) throws IllegalAccessException, InstantiationException { Object object=clazz.newInstance(); return object; } /*獲得Constructor對象的3個(gè)方法*/ private static Constructor<?>[] getConstructorObject0(Class clazz) { Constructor<?>[] constructors=clazz.getConstructors(); return constructors; } private static Constructor<?>[] getConstructorObject1(Class clazz) { Constructor<?>[] constructors=clazz.getDeclaredConstructors(); return constructors; } private static Constructor<?> getConstructorObject2(Class clazz) throws NoSuchMethodException { Constructor<?> constructor=clazz.getConstructor(SomeClass.class, AnotherClass.class, OneClassMore.class); return constructor; } private static Constructor<?> getConstructorObject3(Class clazz) throws NoSuchMethodException { Constructor<?> constructor=clazz.getDeclaredConstructor(SomeClass.class, AnotherClass.class, OneClassMore.class); return constructor; } /*經(jīng)常使用的Constructor對象的2個(gè)方法*/ private static Object useConstructorObject0(Constructor<?> constructor) throws IllegalAccessException, InvocationTargetException, InstantiationException { //under here,if the variable override==true,jvm willl not check the accessible modifier Object object=constructor.newInstance(new SomeClass(),new AnotherClass(),new OneClassMore()); return object; } private static void useConstructorObject1(Constructor<?> constructor) { //under here changing "override" variable's value who is defined in AccessibleObject,the "super and super" Class of Constructor constructor.setAccessible(true); } /*還有一些*/ private static Class<?> useConstructorObject2(Constructor<?> constructor) { Class clazz=constructor.getDeclaringClass(); return clazz; } private static int useConstructorObject3(Constructor<?> constructor) { int modifiers=constructor.getModifiers(); return modifiers; } private static String useConstructorObject4(Constructor<?> constructor) { //constructor name is same as the class name String constructorName = constructor.getName(); //under here getDeclaringClass().getName(); return constructorName; } /*獲取Field對象的4個(gè)方法*/ private static Field[] getFieldObject0(Class clazz){ Field[] fields = clazz.getFields(); return fields; } private static Field[] getFieldObject1(Class clazz){ Field[] declaredFields = clazz.getDeclaredFields(); return declaredFields; } private static Field getFieldObject2(Class clazz) throws NoSuchFieldException { Field field = clazz.getField("theFieldName"); return field; } private static Field getField3(Class clazz) throws NoSuchFieldException { Field field = clazz.getDeclaredField("theFieldName"); return field; } /*經(jīng)常使用的Field對象的3個(gè)方法*/ private static Object useFieldObject0(Field field,Object object) throws IllegalAccessException { Object fieldValue = field.get(object); return fieldValue; } private static void useFieldObject1(Field field,Object object) throws IllegalAccessException { //an object as the field value field.set(object,new Object()); } private static void useFieldObject2(Field field){ //same process field.setAccessible(true); } /*還有一些*/ private static int useFieldObject3(Field field){ int modifiers = field.getModifiers(); return modifiers; } private static String useFieldObject4(Field field){ String fieldName = field.getName(); return fieldName; } /*獲取Method對象的4個(gè)方法*/ private static Method[] getMethodObject0(Class clazz){ Method[] methods=clazz.getMethods(); return methods; } private static Method[] getMethodObject1(Class clazz){ Method[] methods=clazz.getDeclaredMethods(); return methods; } private static Method getMethodObject2(Class clazz) throws NoSuchMethodException { Method method=clazz.getMethod("someMethodName",SomeClass.class,AnotherClass.class,OneClassMore.class); return method; } private static Method getMethodObject3(Class clazz) throws NoSuchMethodException { Method method=clazz.getDeclaredMethod("someMethodName",SomeClass.class,AnotherClass.class,OneClassMore.class); return method; } /*經(jīng)常使用的Field對象的2個(gè)方法*/ private static Object useMethodObject0(Method method,Object object) throws InvocationTargetException, IllegalAccessException { Object returnedobject=method.invoke(object,new SomeClass(),new AnotherClass(),new OneClassMore()); return returnedobject; } private static void useMethodObject1(Method method){ method.setAccessible(true); } /*還有一些*/ private static int useMethodObject2(Method method){ int modifiers = method.getModifiers(); return modifiers; } private static String useMethodObject3(Method method){ String methodName = method.getName(); return methodName; } /* tips 通過getMethods(),得到該類或接口獨(dú)有的和繼承自它的所有父類與接口的public方法組成的數(shù)組. 通過getDeclaredMethods(),得到該類或接口獨(dú)有的所有方法,(包括public和非public). */ /*just as a empty template for convenience*/ private static void m(){ } }
總結(jié)
以上所述是小編給大家介紹的列舉java語言中反射的常用方法及實(shí)例代碼,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
Java?Git?Commit?Message使用規(guī)范
這篇文章主要介紹了Java?Git?Commit?Message使用規(guī)范,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助2022-08-08vue 使用vuex在頁面跳轉(zhuǎn)的實(shí)現(xiàn)方式
這篇文章主要介紹了vue 使用vuex在頁面跳轉(zhuǎn)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java mockito單元測試實(shí)現(xiàn)過程解析
這篇文章主要介紹了Java mockito單元測試實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08springboot2自動(dòng)加載sql文件的實(shí)現(xiàn)
本文主要介紹了springboot2自動(dòng)加載sql文件的實(shí)現(xiàn),通過配置文件或注解的方式,我們可以輕松地將SQL語句映射到數(shù)據(jù)庫中,實(shí)現(xiàn)自動(dòng)加載,感興趣的可以了解一下2023-11-11兩種Eclipse部署動(dòng)態(tài)web項(xiàng)目方法
這篇文章主要介紹了兩種Eclipse部署動(dòng)態(tài)web項(xiàng)目方法,需要的朋友可以參考下2015-11-11