欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2019年07月21日 16:57:02   作者:張星爍  
反射機制指的是程序在運行時能夠獲取自身的信息。這篇文章主要介紹了列舉java語言中反射的常用方法,需要的朋友可以參考下

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語言中反射的常用方法及實例代碼,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

相關文章

  • SpringCloud中的Feign詳解

    SpringCloud中的Feign詳解

    這篇文章主要介紹了SpringCloud中的Feign詳解,Feign是一個聲明式的Web Service客戶端,以Java接口注解的方式調用Http請求,同時Feign整合了Ribbon和Hystrix,實現(xiàn)負載均衡與容斷功能,需要的朋友可以參考下
    2023-09-09
  • Java?Git?Commit?Message使用規(guī)范

    Java?Git?Commit?Message使用規(guī)范

    這篇文章主要介紹了Java?Git?Commit?Message使用規(guī)范,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-08-08
  • Java中Math.round()的用法及說明

    Java中Math.round()的用法及說明

    這篇文章主要介紹了Java中Math.round()的用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 解決feign調用接口不穩(wěn)定的問題

    解決feign調用接口不穩(wěn)定的問題

    這篇文章主要介紹了解決feign調用接口不穩(wěn)定的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 淺拷貝和深拷貝原理分析

    淺拷貝和深拷貝原理分析

    Java 對象拷貝是為對象賦值的一種方式,簡單來說就是創(chuàng)建一個和原對象相同的對象,新創(chuàng)建的對象是原對象的一個副本。面試官賊拉喜歡在面試的時候問一問你淺拷貝和深拷貝的原理
    2021-08-08
  • vue 使用vuex在頁面跳轉的實現(xiàn)方式

    vue 使用vuex在頁面跳轉的實現(xiàn)方式

    這篇文章主要介紹了vue 使用vuex在頁面跳轉的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • JAVA用for循環(huán)打印空心菱形

    JAVA用for循環(huán)打印空心菱形

    大家好,本篇文章主要講的是JAVA用for循環(huán)打印空心菱形,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Java mockito單元測試實現(xiàn)過程解析

    Java mockito單元測試實現(xiàn)過程解析

    這篇文章主要介紹了Java mockito單元測試實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • springboot2自動加載sql文件的實現(xiàn)

    springboot2自動加載sql文件的實現(xiàn)

    本文主要介紹了springboot2自動加載sql文件的實現(xiàn),通過配置文件或注解的方式,我們可以輕松地將SQL語句映射到數(shù)據(jù)庫中,實現(xiàn)自動加載,感興趣的可以了解一下
    2023-11-11
  • 兩種Eclipse部署動態(tài)web項目方法

    兩種Eclipse部署動態(tài)web項目方法

    這篇文章主要介紹了兩種Eclipse部署動態(tài)web項目方法,需要的朋友可以參考下
    2015-11-11

最新評論