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

java 中如何獲取字節(jié)碼文件的相關(guān)內(nèi)容

 更新時間:2017年04月06日 09:48:48   投稿:lqh  
這篇文章主要介紹了java 中如何獲取字節(jié)碼文件的相關(guān)內(nèi)容的相關(guān)資料,需要的朋友可以參考下

java 中如何獲取字節(jié)碼文件的相關(guān)內(nèi)容

反射機制是指在運行狀態(tài)中,對任意一個類(class文件),都能知道這個類的所有屬性和方法;對任意一個對象,都能調(diào)用這個對象的方法和屬性。這種動態(tài)的獲取信息和動態(tài)的調(diào)用對象的方法的功能稱為——Java語言的反射機制。

簡單點說,動態(tài)的獲取類中的信息,這就是Java的反射機制。

在Java的反射機制中,我們可以通過配置文件信息,然后通過類名來獲取類中包含的詳細信息,如構(gòu)造函數(shù)、成員變量和成員函數(shù)等。在接下來,作者將分別演示如何通過類名來獲取類中包含的信息。

一、獲取字節(jié)碼文件的構(gòu)造函數(shù)

import java.lang.reflect.Constructor;

public class GetClassConstructor {
  public static void main(String[] args) throws Exception {
    createNewObject_2();
  }

  public static void createNewObject_2() throws Exception {
    /**
     * 當獲取指定名稱對應(yīng)類中的所體現(xiàn)的對象時,而且該對象的初始化不適用空參的構(gòu)造函數(shù)
     * 可以先通過該類的字節(jié)碼文件對象,獲取空參的構(gòu)造函數(shù)
     * 該方法為:getConstructor(parameterTypes)
     */

  // 包名一定要寫全,否則會報"java.lang.ClassNotFoundException"異常
  String name = "src.Person";
    // 找尋該名稱類文件,并加進內(nèi)存,產(chǎn)生Class對象
    Class clazz = Class.forName(name);
    // 獲取指定的構(gòu)造函數(shù)對象
    Constructor constructor = clazz.getConstructor(String.class, int.class);
    // 通過該構(gòu)造器對象的newInstance進行對象的初始化
    constructor.newInstance("小明", 12);
  }

  public static void createNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
    String name = "src.Person";
    // 找尋該名稱類文件,并加進內(nèi)存,產(chǎn)生Class對象
    Class clazz = Class.forName(name);
    // 產(chǎn)生該類的實例對象(空參)
    Object obj = clazz.newInstance();
  }
}

二、獲取字節(jié)碼文件的成員變量

import java.lang.reflect.Field;

public class GetClassField {
  public static void main(String[] args) throws Exception {
    getField();
  }

  /**
   * 獲取字節(jié)碼文件中的成員變量
   */
  public static void getField() throws Exception {
    Class clazz = Class.forName("src.Person");
    Field field = null;

    // 獲取本類字段,包含私有
    field = clazz.getDeclaredField("age");

    // 對私有字段的訪問取消權(quán)限檢查,可稱之為暴力訪問
    field.setAccessible(true);

    Object obj = clazz.newInstance();

    field.set(obj, Integer.valueOf(89));

    Object o = field.get(obj);
    System.out.println(o);
  }
}

三、獲取字節(jié)碼文件的成員函數(shù)

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class GetClassMethod {
  public static void main(String[] args) throws Exception {
    getMethod_3();
  }

  public static void getMethod_3() throws Exception {
    Class clazz = Class.forName("src.Person");
    Method method = clazz.getMethod("walkInfo", new Class[]{String.class, Integer.TYPE});
    Object obj = clazz.newInstance();
    method.invoke(obj, new Object[]{"小強", Integer.valueOf(20)});
  }

  public static void getMethod_2() throws Exception {
    Class clazz = Class.forName("src.Person");

    // 獲取空參數(shù)的方法
    Method method = clazz.getMethod("show", (Class[]) null);
    Constructor constructor = clazz.getConstructor(new Class[]{String.class, Integer.TYPE});
    Object obj = constructor.newInstance(new Object[]{"小明", Integer.valueOf(12)});
    method.invoke(obj, (Object[]) null);
  }

  /**
   * 獲取指定Class中的公有函數(shù)
   */
  public static void getMethod() throws Exception {
    Class clazz = Class.forName("src.Person");

    // 獲取的都是類中的公有方法
    Method[] methods = clazz.getMethods();

    // 獲取本類中的所有方法
    methods = clazz.getDeclaredMethods();
    Method[] var5 = methods;
    int var4 = methods.length;

    for (int var3 = 0; var3 < var4; ++var3) {
      Method method = var5[var3];
      System.out.println(method);
    }
  }
}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • 使用springboot開發(fā)的第一個web入門程序的實現(xiàn)

    使用springboot開發(fā)的第一個web入門程序的實現(xiàn)

    這篇文章主要介紹了使用springboot開發(fā)的第一個web入門程序的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Java23種設(shè)計模式中的單例模式你了解嗎

    Java23種設(shè)計模式中的單例模式你了解嗎

    這篇文章主要為大家詳細介紹了Java23種設(shè)計模式中的單例模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • java的json解析類庫使用示例

    java的json解析類庫使用示例

    這篇文章主要介紹了java的json解析類庫使用方法,這里使用Zson解析json,這是一個開源的json處理類庫
    2014-03-03
  • Java判斷絕對值的方法總結(jié)

    Java判斷絕對值的方法總結(jié)

    在本文中作者為大家分享了兩種Java判斷絕對值的方法,對此有興趣的朋友可以和小編一起學習下。
    2018-02-02
  • MySQL中關(guān)鍵字UNION和UNION ALL的區(qū)別

    MySQL中關(guān)鍵字UNION和UNION ALL的區(qū)別

    本文主要介紹了MySQL中關(guān)鍵字UNION和UNION ALL的區(qū)別,深入探討UNION和UNION ALL的定義、用法、主要區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • 解決Spring或SpringBoot開啟事務(wù)以后無法返回自增主鍵的問題

    解決Spring或SpringBoot開啟事務(wù)以后無法返回自增主鍵的問題

    這篇文章主要介紹了解決Spring或SpringBoot開啟事務(wù)以后無法返回自增主鍵的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 使用jpa之動態(tài)插入與修改(重寫save)

    使用jpa之動態(tài)插入與修改(重寫save)

    這篇文章主要介紹了使用jpa之動態(tài)插入與修改(重寫save),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解

    Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于Java面試題篇之Sleep()方法與Wait()方法區(qū)別的相關(guān)資料,wait()是Object類中的方法,而sleep()是Thread類中的靜態(tài)方法,wait()方法用于多個線程之間的協(xié)作和通信,而sleep()方法用于線程的休眠,需要的朋友可以參考下
    2024-07-07
  • Spring整合Mybatis思路梳理總結(jié)

    Spring整合Mybatis思路梳理總結(jié)

    MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作,本篇文章帶你了解Spring整合Mybatis的思路
    2022-02-02
  • SpringBoot如何統(tǒng)一配置bean的別名

    SpringBoot如何統(tǒng)一配置bean的別名

    這篇文章主要介紹了SpringBoot如何統(tǒng)一配置bean的別名,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11

最新評論