本文目錄一覽:
- 1、java反射機制詳解
- 2、java的反射技術有什麼用?
- 3、Java的反射機制是什麼,如何實現
- 4、JAVA中反射是什麼
- 5、北大青鳥java培訓:Java高級開發必須懂的反射是什麼樣的?
- 6、Java裏面反射的原理是什麼?
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(); //與上面的方法等價
java的反射技術有什麼用?
一、反射的概述
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
要想解剖一個類,必須先要獲取到該類的位元組碼文件對象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個位元組碼文件對應的Class類型的對象.
以上的總結就是什麼是反射
反射就是把java類中的各種成分映射成一個個的Java對象
例如:一個類有:成員變量、方法、構造方法、包等等信息,利用反射技術可以對一個類進行解剖,把個個組成部分映射成一個個對象。(其實:一個類中這些成員方法、構造方法、在加入類中都有一個類來描述)
如圖是類的正常加載過程:反射的原理在與class對象。
熟悉一下加載的時候:Class對象的由來是將class文件讀入內存,並為之創建一個Class對象。
二、Java中為什麼需要反射?反射要解決什麼問題?
Java中編譯類型有兩種:
靜態編譯:在編譯時確定類型,綁定對象即通過。
動態編譯:運行時確定類型,綁定對象。動態編譯最大限度地發揮了Java的靈活性,體現了多態的應用,可以減低類之間的耦合性。
Java反射是Java被視為動態(或准動態)語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public、static等)、superclass(例如Object)、實現之interfaces(例如Cloneable),也包括fields和methods的所有信息,並可於運行時改變fields內容或喚起methods。
Reflection可以在運行時加載、探知、使用編譯期間完全未知的classes。即Java程序可以加載一個運行時才得知名稱的class,獲取其完整構造,並生成其對象實體、或對其fields設值、或喚起其methods。
反射(reflection)允許靜態語言在運行時(runtime)檢查、修改程序的結構與行為。
在靜態語言中,使用一個變量時,必須知道它的類型。在Java中,變量的類型信息在編譯時都保存到了class文件中,這樣在運行時才能保證準確無誤;換句話說,程序在運行時的行為都是固定的。如果想在運行時改變,就需要反射這東西了。
實現Java反射機制的類都位於java.lang.reflect包中:
Class類:代表一個類
Field類:代表類的成員變量(類的屬性)
Method類:代表類的方法
Constructor類:代表類的構造方法
Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法
一句話概括就是使用反射可以賦予jvm動態編譯的能力,否則類的元數據信息只能用靜態編譯的方式實現,例如熱加載,Tomcat的classloader等等都沒法支持。
三、使用
1、獲取Class對象的三種方式
1.1 Object —— getClass();
1.2 任何數據類型(包括基本數據類型)都有一個「靜態」的class屬性
1.3 通過Class類的靜態方法:forName(String className)(常用)
請點擊輸入圖片描述
希望對您有所幫助!~
Java的反射機制是什麼,如何實現
Java中的反射機制,通俗點解釋就是能夠在程序運行中動態獲取到內存中任一對象的信息,這些信息包括對象所屬類、類中的方法和屬性、以及它們的訪問控制域和返回值類型等等,還可以通過反射動態調用對象中的方法,而不管該方法的訪問域是私有或是公開,包括構造方法,還能實現動態代理等。總之,反射能夠破壞掉JAVA類本身的封裝性,進而獲取其私有的或公開的信息,也就能突破封裝進而調用私有的或公開的方法。
實現的話就是通過反射接口,JAVA把反射相關的類接口都封裝在了java.lang.reflect這個包中,你可以研究下這個包中的類,對於類的每一個屬性,如變量、方法,構造方法,這個包中都就與之相對應的類,通過這個類就可以操作這個屬性了。
java反射很強大,但也很危險,在實際開發中應少用或不用,在必要用之時,往往也能解決你遇到的問題。
JAVA中反射是什麼
JAVA中反射是動態獲取信息以及動態調用對象方法的一種反射機制。
Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態語言的一個關鍵性質。
Java反射的功能是在運行時判斷任意一個對象所屬的類,在運行時構造任意一個類的對象,在運行時判斷任意一個類所具有的成員變量和方法,在運行時調用任意一個對象的方法,生成動態代理。
擴展資料:
JAVA中反射實例:
1、Class superClass=clazz.getSuperclass();//獲取父類。
System.out.println(“getSuperclass:”+superClass)。
2、Class[] interfaces=clazz.getInterfaces();//獲取實現接口。
System.out.println(“getInterfaces:”+interfaces.length)。
3、Constructor[] cons=clazz.getConstructors();//構造方法。
System.out.println(“getConstructors:”+cons.length)。
參考資料來源:百度百科: JAVA反射機制
北大青鳥java培訓:Java高級開發必須懂的反射是什麼樣的?
理解反射對學習Java框架有很大的幫助,如Spring框架的核心就是使用Java反射實現的,而且對做一些Java底層的操作會很有幫助。
一、Class類的使用1、萬事萬物皆對象,(當然,基本數據類型,靜態成員不是面向對象(屬於類的)),所以我們創建的每一個類也都是對象,即類本身是java.lang.Class類的實例對象,但是這些對象都不需要new出來,因為java.lang.Class類的構造方法是私有的2、任何一個類都是Class類的實例對象,這個實例對象有三種表示方式:(我們新建一個Student類)(上海尚學堂java全程老師面授+實戰教學)①Classc1=Student.class;//實際告訴我們任何一個類都有一個隱含的靜態成員變量class(知道類名時用)②Classc2=stu.getClass();//已知該類的對象通過getClass方法(知道對象時用)③Classc3=Class.forName(“類的全名”);//會有一個ClassNotFoundException異常官網解釋說:c1,c2表示了Student類的類類型()classtype),萬事萬物皆對象,類也是對象,是Class類的實例對象,這個對象我們成為該類的類類型(有點亂,但是慢慢捋一下還是能理解的)這裡有一點值得注意,當我們執行System.out.println(c1==c2);語句,結果返回的是true,這是為什麼呢?原因是不管c1還是c2都代表了Student類的類類型,一個類可能是Class類的一個實例對象。
我們完全可以通過類的類類型創建該類的對象實例,即通過c1或c2創建Student的實例。
Studentstu=(Student)c1.newInstance();//前提是必須要有無參的構造方法,因為該語句會去調用其無參構造方法。
該語句會拋出異常。
二、動態加載類1、編譯時加載類是靜態加載類,new創建對象是靜態加載類,在編譯時刻就需要加載所有可用使用到的類,如果有一個用不了,那麼整個文件都無法通過編譯2、運行時加載類是動態加載類Classc= Class.forName(“類的全名”),不僅表示了類的類型,還表示了動態加載類,編譯不會報錯,在運行時才會加載,使用接口標準能更方便動態加載類的實現。
功能性的類盡量使用動態加載,而不用靜態加載。
甘肅電腦培訓發現很多軟件比如QQ,360的在線升級,並不需要重新編譯文件,只是動態的加載新的東西。
Java裏面反射的原理是什麼?
Java在編譯之後會生成一個class文件,反射通過位元組碼文件找到其類中的方法和屬性等。
通過反射,java可以動態的加載未知的外部配置對象,臨時生成位元組碼進行加載使用,使代碼更靈活,極大地提高應用的擴展性。
其實博客會有更加詳細的解釋。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/243739.html