java運用反射的例子(java運用反射的例子有哪些)

本文目錄一覽:

java反射有哪些例子

struts2框架就是最典型的反射例子,它的核心控制器攔截器就是典型的反射。

Java的反射到底有什麼用途?

反射的作用可謂是博大精深,

JDK動態代理生成代理類的位元組碼後,首先把這個類通過defineclass定義成一個類,然後用class.for(name)會把該類載入到jvm,之後我們就可以通過,A.class.GetMethod()獲取其方法,然後通過invoke調用其方法,在調用這個方法時,實際上會通過被代理類的引用再去調用原方法。

Java反射包reflection提供對Class,Method,field,constructor1 等信息的封裝類型

通過這些api可以輕易獲得一個類的各種信息並且可以進行實例化,方法調用等。

類中的private參數可以通過setaccessible方法強制獲取。

哪些項目中用到了Java反射機制?

什麼是反射?將類的每個組件封裝到另一個對象中的過程稱為反射。其中,組件表示我們類的成員變數(Field)、構造方法(Constructor)和成員方法(Method)。反射使您可以在程序運行期間操作類對象,從而提高程序的靈活性。解耦提高了程序的可擴展性,提高了代碼重用率,便於外部調用。任何類別只要知道類別名稱,就可以知道該類別的所有屬性和方法。

可以對任何對象調用任何方法之一。我們通過一個事例引入。首先不要考慮反射問題,先完成事件。例子:訂單結算時可以通過支付寶支付,如訂單程序美團投遞,可以通過微信結算、銀行卡等方式直接進行。那麼,在與美團外賣支付的公司合作時,必須制定支付指南。這個規範在Java中怎麼表達?

當然,由於使用了界面,所以在美團外賣中指定了界面後,這些合作企業實現了這個界面。「反射」(Reflection)是Java的特徵之一,它允許正在運行的Java程序檢查自己,並直接操作程序的內部屬性和方法。反射是所有注釋的實現原理,特別是在框架設計中。反射是什麼?主要是指程序可以訪問、檢測和修改自己的狀態。

反射像鏡子一樣,讓開發者知道這個類中有哪些成員。大多數人想知道Java有包,為什麼會有反射。破壞封裝性。通過允許外部訪問個人變數,使類不太安全。就我個人而言,反射機制實際上是上帝的模型。如果方法的調用是Java正確的打開方式,那麼反射機制就是上帝偷偷打開的後門。只要有相應的class存在,什麼都可以調用。那麼,上帝為什麼要打開這個後門呢?這包括靜態和動態概念。

java反射機制詳解

反射就是把Java的各種成分映射成相應的Java類。

Class類的構造方法是private,由JVM創建。

反射是java語言的一個特性,它允程序在運行時(注意不是編譯的時候)來進行自我檢查並且對內部的成員進行操作。例如它允許一個java的類獲取他所有的成員變數和方法並且顯示出來。Java 的這一能力在實際應用中也許用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數定義相關的信息。(來自Sun)

JavaBean 是 reflection 的實際應用之一,它能讓一些工具可視化的操作軟體組件。這些工具通過 reflection 動態的載入並取得 Java 組件(類) 的屬性。

反射是從1.2就有的,後面的三大框架都會用到反射機制,涉及到類”Class”,無法直接new CLass(),其對象是內存里的一份位元組碼.

Class 類的實例表示正在運行的 Java 應用程序中的類和介面。枚舉是一種類,注釋是一種介面。每個數組屬於被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。

基本的 Java類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也表示為 Class 對象。Class 沒有公共構造方法。

Class 對象是在載入類時由 Java 虛擬機以及通過調用類載入器中的 defineClass 方法自動構造的。

Person p1 = new Person();

//下面的這三種方式都可以得到位元組碼

CLass c1 = Date.class();

p1.getClass();

//若存在則載入,否則新建,往往使用第三種,類的名字在寫源程序時不需要知道,到運行時再傳遞過來

Class.forName(“java.lang.String”);

Class.forName()位元組碼已經載入到java虛擬機中,去得到位元組碼;java虛擬機中還沒有生成位元組碼 用類載入器進行載入,載入的位元組碼緩衝到虛擬機中。 

另外,大家可以關注微信公眾號Java技術棧回復:JVM,獲取我整理的系列JVM教程,都是乾貨。

考慮下面這個簡單的例子,讓我們看看 reflection 是如何工作的。

import java.lang.reflect.*;

public class DumpMethods {

public static void main(String args[]) {

try {

Class c = Class.forName(“java.util.Stack”);

Method m[] = c.getDeclaredMethods();

for (int i = 0; i m.length; i++)

System.out.println(m[i].toString());

}

catch (Throwable e){

System.err.println(e);

}

}

}

public synchronized java.lang.Object java.util.Stack.pop()

public java.lang.Object java.util.Stack.push(java.lang.Object)

public boolean java.util.Stack.empty()

public synchronized java.lang.Object java.util.Stack.peek()

public synchronized int java.util.Stack.search(java.lang.Object)

這樣就列出了java.util.Stack 類的各方法名以及它們的限制符和返回類型。這個程序使用 Class.forName 載入指定的類,然後調用 getDeclaredMethods 來獲取這個類中定義了的方法列表。java.lang.reflect.Methods 是用來描述某個類中單個方法的一個類。

以下示例使用 Class 對象來顯示對象的類名:

void printClassName(Object obj) {

System.out.println(“The class of ” + obj +

” is ” + obj.getClass().getName());

}

還可以使用一個類字面值(JLS Section 15.8.2)來獲取指定類型(或 void)的 Class 對象。例如:

System.out.println(“The name of class Foo is: “+Foo.class.getName());

在沒有對象實例的時候,主要有兩種辦法。

//獲得類類型的兩種方式

Class cls1 = Role.class;

Class cls2 = Class.forName(“yui.Role”);

注意第二種方式中,forName中的參數一定是完整的類名(包名+類名),並且這個方法需要捕獲異常。現在得到cls1就可以創建一個Role類的實例了,利用Class的newInstance方法相當於調用類的默認的構造器。

Object o = cls1.newInstance();

//創建一個實例

//Object o1 = new Role(); //與上面的方法等價

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/288981.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-24 03:01
下一篇 2024-12-24 03:01

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python 常用資料庫有哪些?

    在Python編程中,資料庫是不可或缺的一部分。隨著互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的資料庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • Python通配符有哪些

    Python通配符是一種表示字元串中模糊匹配的有效工具,用於匹配與具有特定模式匹配的字元串。Python中主要的通配符有:*,?,[]和{}。 一、星號通配符 * 在Python中…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論