本文目錄一覽:
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-hant/n/288981.html