java語言中反射的常用方法及實例代碼

本篇內容主要講解“java語言中反射的常用方法及實例代碼”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java語言中反射的常用方法及實例代碼”吧!

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供于都網(wǎng)站建設、于都做網(wǎng)站、于都網(wǎng)站設計、于都網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、于都企業(yè)網(wǎng)站模板建站服務,十余年于都做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。

Java反射機制

一、什么是反射機制

簡單的來說,反射機制指的是程序在運行時能夠獲取自身的信息。在java中,只要給定類的名字,  那么就可以通過反射機制來獲得類的所有信息。

二、哪里用到反射機制

有些時候,我們用過一些知識,但是并不知道它的專業(yè)術語是什么,在剛剛學jdbc時用過一行代碼,  Class.forName("com.MySQL.jdbc.Driver.class").newInstance();但是那時候只知道那行代碼是生成  驅動對象實例,并不知道它的具體含義。聽了反射機制這節(jié)課后,才知道,原來這就是反射,現(xiàn)在很多開

框架都用到反射機制,hibernate、struts都是用反射機制實現(xiàn)的。

三、反射機制的優(yōu)點與缺點

為什么要用反射機制?直接創(chuàng)建對象不就可以了嗎,這就涉及到了動態(tài)與靜態(tài)的概念,

靜態(tài)編譯:在編譯時確定類型,綁定對象,即通過。

動態(tài)編譯:運行時確定類型,綁定對象。動態(tài)編譯最大限度發(fā)揮了java的靈活性,體現(xiàn)了多  態(tài)的應用,有以降低類之間的藕合性。

一句話,反射機制的優(yōu)點就是可以實現(xiàn)動態(tài)創(chuàng)建對象和編譯,體現(xiàn)出很大的靈活性,特別是在J2EE的開發(fā)中它的靈活性就表現(xiàn)的十分明顯。比如,一個大型的軟件,不可能一次就把把它設計的很完美,當這個程序編譯后,發(fā)布了,當發(fā)現(xiàn)需要更新某些功能時,我們不可能要用戶把以前的卸載,再重新安裝新的版本,假如這樣的話,這個軟件肯定是沒有多少人用的。采用靜態(tài)的話,需要把整個程序重新編譯一次才可以實現(xiàn)功能的更新,而采用反射機制的話,它就可以不用卸載,只需要在運行時才動態(tài)的創(chuàng)建和編譯,就可以實現(xià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;/** * 這個類列舉了java語言中關于反射機制的常用的一些方法 * @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個方法*/  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個方法*/  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個方法*/  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個方法*/  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個方法*/  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個方法*/  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個方法*/  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(),得到該類或接口獨有的和繼承自它的所有父類與接口的public方法組成的數(shù)組.  通過getDeclaredMethods(),得到該類或接口獨有的所有方法,(包括public和非public).  */  /*just as a empty template for convenience*/  private static void m(){  }}

到此,相信大家對“java語言中反射的常用方法及實例代碼”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

分享文章:java語言中反射的常用方法及實例代碼
網(wǎng)頁鏈接:http://muchs.cn/article4/ispgoe.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設關鍵詞優(yōu)化、軟件開發(fā)網(wǎng)站營銷、網(wǎng)站策劃、電子商務

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設