1. 程式人生 > >Java反射在JVM的實現

Java反射在JVM的實現

本文目錄

  1. 什麼是Java反射,有什麼用?
  2. Java Class檔案的結構
  3. Java Class載入的過程
  4. 反射在native的實現
  5. 附錄

1. 什麼是Java反射,有什麼用?

反射使程式程式碼能夠接入裝載到JVM中的類的內部資訊,允許在編寫與執行時,而不是原始碼中選定的類協作的程式碼,是以開發效率換執行效率的一種手段。這使反射成為構建靈活應用的主要工具。

反射可以:

  1. 呼叫一些私有方法,實現黑科技。比如雙卡簡訊傳送、設定狀態列顏色、自動掛電話等。
  2. 實現序列化與反序列化,比如PO的ORM,Json解析等。
  3. 實現跨平臺相容,比如JDK中的SocketImpl的實現
  4. 通過xml或註解,實現依賴注入(DI),註解處理,動態代理,單元測試等功能。比如Retrofit、Spring或者Dagger

2. Java Class檔案的結構

在*.class檔案中,以Byte流的形式進行Class的儲存,通過一系列Load,Parse後,Java程式碼實際上可以對映為下圖的結構體,這裡可以用javap命令或者IDE外掛進行檢視。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 typedef struct { u4             magic;/*0xCAFEBABE*/
u2             minor_version; /*網上有表可查*/ u2             major_version; /*網上有表可查*/ u2             constant_pool_count; cp_info        constant_pool[constant_pool_count-1]; u2             access_flags; u2             this_class; u2             super_class; u2             interfaces_count;
u2             interfaces[interfaces_count]; //重要 u2             fields_count; field_info     fields[fields_count]; //重要 u2             methods_count; method_info    methods[methods_count]; u2             attributes_count; attribute_info attributes[attributes_count]; }ClassBlock;
  • 常量池(constant pool):類似於C中的DATA段與BSS段,提供常量、字串、方法名等值或者符號(可以看作偏移定值的指標)的存放
  • access_flags: 對Class的flag修飾
    1 2 3 4 5 6 7 typedef enum { ACC_PUBLIC = 0x0001, ACC_FINAL = 0x0010, ACC_SUPER = 0x0020,

    相關推薦

    利用JAVA反射機制實現調用私有方法

    parse try ble cat 權限 利用 enabled tde mod 1.fragment是AccessibilityFragment的對象。須要被調用的方法的類。 setAccessible(true)並非將方法的訪問權限改成了public。而是取

    java反射機制實現攔截器

    tor 攔截 stat 重要 obj static interface 程序 bject 實現一個攔截器必須要實現一下幾個類: 1 目標類接口:目標類要實現的接口。 package com.lanvis.reflect; public interface ITarge

    利用java反射機制實現List<Map<String, Object>>轉化為List<JavaBean>

    tis one row 註解 網上 span mybatis star mod 最近在用mybatis做項目,遇到將date格式化顯示到easyui的問題,需要將List<Map<String, Object>>轉化為List<JavaBean

    利用Java反射機制實現物件相同欄位的複製

    一、如何實現不同型別物件之間的複製問題? 1、為什麼會有這個問題? 近來在進行一個專案開發的時候,為了隱藏後端資料庫表結構、同時也為了配合給前端一個更友好的API介面文件(swagger API文件),我採用POJO來對應資料表結構,使用VO來給傳遞前端要展示的資料,同時使用DTO來進行請求

    利用Java反射機制實現對象相同字段的復制

    rop 對象復制 bject 不同的 turn 有一個 運算符 mes 不讓 一。如何實現不同類型對象之間的復制問題? 1、為什麽會有這個問題? 近來在進行一個項目開發的時候,為了隱藏後端數據庫表結構、同時也為了配合給前端一個更友好的API接口文檔(swagger API文

    java反射+註解實現Entity類與Dto類相互轉換

     序言   近期在工作中管理程式碼時發現,在專案中從Dao層到Service層資料傳遞中通過大量的get(),set()方法去一個一個的去拿值去賦值,導致程式碼篇幅過長,對此甚是討厭,並且嚴重消耗開發時間。起初找過些關於這塊的資料,現在大部分都是Entity類和Dto類的屬性名相同的前提下,利用反

    (小工具)Java反射機制實現任意物件集合按指定任意欄位進行分組通用程式實踐

    在應用開發的時候,我們有時候會遇到需要對一個給定集合進行分組的情況。如果該集合的資料記錄是從資料庫的獲取,通常我們最簡單的方案是直接在sql層面select後group by完成。 但是,假如某些場景下該資料不是從資料庫獲取呢?那就需要在應用程式層面進行分

    (小工具)Java反射機制實現任意物件集合排序並且獲取排列名次的通用程式實踐

    在應用開發的時候,我們有時候會遇到需要對一個給定集合進行排序的情況。如果該集合的資料記錄是從資料庫的獲取,通常我們最簡單的方案是直接在sql層面select後order by完成。 但是,假如某些場景下該資料不是從資料庫獲取呢?那就需要在應用程式層面進行排

    利用java反射機制實現讀取excel表格中的資料

    如果直接把excel表格中的資料匯入資料庫,首先應該將excel中的資料讀取出來。 為了實現程式碼重用,所以使用了Object,而最終的結果是要獲取一個list如List<User>、List<Book>等,所以需要使用泛型機制去實現。下面會給出程式

    Java反射+註解實現自動持久化小例子(程式碼未優化)

    需要實現的功能:根據實體類自動生成Sql語句與引數。 基本思路是:在實體類上標識註解,使用反射讀取註解然後拼接Sql語句。 哦了,開始研究程式碼~ 有請主人公註解:

    利用java反射機制實現javaweb自動呼叫類的方法

    public class BookServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequ

    淺談Java反射實現原理

    從一段示例程式碼開始 Class clz = Class.forName("ClassA"); Object instance = clz.newInstance(); Method method = clz

    Java反射機制實現全部註解獲取

    一 程式碼 class Info{ //給mytoString方法加了2個內建Annotation @Deprecated @SuppressWarnings(value =

    JAVA反射方式實現簡易通用EXCEL下載

    一:註解部分 package com.jianlejun.common.msoffice.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType

    Java反射JVM實現

    本文目錄 什麼是Java反射,有什麼用?Java Class檔案的結構Java Class載入的過程反射在native的實現附錄 1. 什麼是Java反射,有什麼用? 反射使程式程式碼能夠接入裝載到JVM中的類的內部資訊,允許在編寫與執行時,而不

    利用java反射實現工廠創建對象

    傳遞 之前 illegal stack bject 運行時 做的 ace exc public static Object getInstance(Class c){ Object obj = null; try {

    Java利用MethodHandle實現反射時調用super的method

    AS sta port 沒有 ase handle test ble pub 一:實現 1.Base類的實現 package me.silentdoer.reflecsuper; /** * @author silentdoer * @version

    java反射實現前端接收實體對象,去除“null”字符串

    學習工具總結從前臺輸入的的json 格式數據。轉換成對應的實體類後。 可能會出現把null 轉換成“null”字符串。這樣的數據在存入數據庫是可能會因為數據格式,存入時會有問題。實體字段多,修改有很麻煩。所以需要統一編輯處理下。 實體類package com.tansun.ider.model.vo; pub

    Java鎖優化思路及JVM實現

    應用 num nal 高性能 thread collect 傳統 有一個 test 1. 鎖優化的思路和方法 這裏提到的鎖優化,是指在阻塞式的情況下,如何讓性能不要變得太差。但是再怎麽優化,一般來說性能都會比無鎖的情況差一點。 這裏要註意的是,在ReentrantLock中

    JVM學習之java執行緒實現&排程和狀態轉換

    以下blog內容來自《深入理解Java虛擬機器_JVM高階特性與最佳實踐》感謝作者! 1 謹慎使用java 多執行緒   如何提升效率:      使用java時推薦利用多執行緒處理一些操作絕大多數情況下確實能提高效率,提高效率的原理