導航:首頁 > 編程語言 > java反射靜態方法

java反射靜態方法

發布時間:2022-04-11 16:55:48

A. java中的反射機制的原理和用途是什麼

反射技術:其實就是動態載入一個指定的類,並獲取該類中的所有的內容。並將位元組碼文件中的內容都封裝成對象,這樣便於操作這些成員。簡單說:反射技術可以對一個類進行解剖。

反射的好處:大大地增強了程序的擴展性。

反射的基本步驟:

1、獲得Class對象,就是獲取到指定的名稱的位元組碼文件對象。

2、實例化對象,獲得類的屬性、方法或構造函數。

3、訪問屬性、調用方法、調用構造函數創建對象。

獲取這個Class對象,有三種方式:

1:通過每個對象都具備的方法getClass來獲取。弊端:必須要創建該類對象,才可以調用getClass方法。

2:每一個數據類型(基本數據類型和引用數據類型)都有一個靜態的屬性class。弊端:必須要先明確該類。

前兩種方式不利於程序的擴展,因為都需要在程序使用具體的類來完成。

3:使用的Class類中的方法,靜態的forName方法。

B. 關於用java反射調用一個類裡面的方法並執行

Java中要用到反射,首先就必須要獲取到對應的class對象,在Java中有三種方法獲取類對應的class對象。

1、通過類的.class屬性

2、通過類實例的getClass()方法獲取

3、通過Class.forName(String className)方法獲取

現在比如在package下有個類Calculator

publicclassCalculator{	

publicdoubleadd(doublescore1,doublescore2){
returnscore1+score2;
}

publicvoidprint(){
System.out.println("OK");
}

publicstaticdoublemul(doublescore1,doublescore2){
returnscore1*score2;
}
}
publicclassCalculatorTest{

publicstaticvoidmain(String[]args)throwsException{
//通過類的.class屬性獲取
Class<Calculator>clz=Calculator.class;
//或者通過類的完整路徑獲取,這個方法由於不能確定傳入的路徑是否正確,這個方法會拋ClassNotFoundException
// Class<Calculator>clz=Class.forName("test.Calculator");
//或者new一個實例,然後通過實例的getClass()方法獲取
// Calculators=newCalculator();
// Class<Calculator>clz=s.getClass();
//1.獲取類中帶有方法簽名的mul方法,getMethod第一個參數為方法名,第二個參數為mul的參數類型數組
Methodmethod=clz.getMethod("mul",newClass[]{double.class,double.class});
//invoke方法的第一個參數是被調用的對象,這里是靜態方法故為null,第二個參數為給將被調用的方法傳入的參數
Objectresult=method.invoke(null,newObject[]{2.0,2.5});
//如果方法mul是私有的private方法,按照上面的方法去調用則會產生異常NoSuchMethodException,這時必須改變其訪問屬性
//method.setAccessible(true);//私有的方法通過發射可以修改其訪問許可權
System.out.println(result);//結果為5.0
//2.獲取類中的非靜態方法
Methodmethod_2=clz.getMethod("add",newClass[]{double.class,double.class});
//這是實例方法必須在一個對象上執行
Objectresult_2=method_2.invoke(newCalculator(),newObject[]{2.0,2.5});
System.out.println(result_2);//4.5
//3.獲取沒有方法簽名的方法print
Methodmethod_3=clz.getMethod("print",newClass[]{});
Objectresult_3=method_3.invoke(newCalculator(),null);//result_3為null,該方法不返回結果
}
}

C. java中反射的三種方法是

第一種:通過forName()方法;

第二種:類.class;

第三種:對象.getClass()。

舉例如下:

package
test;

public class Demo{

public static void
main(){

Class<?> c1 = null;

Class<?> c2 =
null;

Class<?> c3 =
null;

//三種反射用實例化方式

try{

//最常用的一種形式

c1 =
Class.forName("test.X");

}catch(ClassNotFoundException
e){

e.printStackTrace();

}

//通過Object類中的方法實例化

c2
= new X().getClass();

//通過類.class實例化

c3 =
X.class;

System.out.println("類名:" + c1.getName());
//得到類名

System.out.println("類名:" + c2.getName());
//得到類名

System.out.println("類名:" + c3.getName());
//得到類名

}

}

D. java如何反射調用靜態方法

紅框標記的地方,就是區別的地方,反正吧我個人覺得,其實在有構造器的情況之下,根本無需考慮
那麼多,通殺,管你什麼靜態不靜態,隨便調用!
我也是菜鳥,網路一堆都是讓傳入Null的那種方式:

E. Java如何實現反射靜態載入和動態載入實例代碼詳解

1.Java動態載入類和靜態載入類的區別
new創建對象的方式稱作為靜態載入,而使用Class.forName("XXX")稱作為動態載入,它們倆本質的區別在於靜態載入的類的源程序在編譯時期載入(必須存在),而動態載入的類在編譯時期可以缺席(源程序不必存在)。

2.為什麼需要動態載入類

對於我自己的理解,動態載入類增加了程序的靈活性。比如一個程序中有50個功能,但你可能只會使用其中的一個,如果你用的是靜態載入的方式,你必須在編譯前提供100個功能的所有定義,否則無法編譯通過,若你使用的是動態載入機制,則不需要如此大費周章,用哪一個就定義哪一個即可。
靜態載入:
public class Office_Static {
public static void main(String[] args) {
//new 創建對象,是靜態載入類,在編譯時刻就需要載入所有的可能使用到的類
if("Word".equals(args[0])){
Word w = new Word();
w.start();
}
if("Excel".equals(args[0])){
Excel e = new Excel();
e.start();
}
}
}
這個程序編譯時必須有Word和Excel這兩個類存在才行,即使判斷後用不到Excel也要載入
動態載入:
介面OfficeAble :
public interface OfficeAble {
public void start();}

F. 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(); //與上面的方法等價

G. JAVA中反射是什麼

JAVA中反射是動態獲取信息以及動態調用對象方法的一種反射機制。

Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態語言的一個關鍵性質。

Java反射的功能是在運行時判斷任意一個對象所屬的類,在運行時構造任意一個類的對象,在運行時判斷任意一個類所具有的成員變數和方法,在運行時調用任意一個對象的方法,生成動態代理。

(7)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反射機制

H. java的反射技術有什麼用

一、反射的概述

JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
要想解剖一個類,必須先要獲取到該類的位元組碼文件對象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個位元組碼文件對應的Class類型的對象.


以上的總結就是什麼是反射
反射就是把java類中的各種成分映射成一個個的Java對象
例如:一個類有:成員變數、方法、構造方法、包等等信息,利用反射技術可以對一個類進行解剖,把個個組成部分映射成一個個對象。(其實:一個類中這些成員方法、構造方法、在加入類中都有一個類來描述)
如圖是類的正常載入過程:反射的原理在與class對象。
熟悉一下載入的時候:Class對象的由來是將class文件讀入內存,並為之創建一個Class對象。

希望對您有所幫助!~

I. 請問java中的反射機制與用法

Java中反射常用知識:
1. 要想使用反射,首先需要獲得待處理類或對象所對應的Class對象。
2. 獲取某個類或某個對象所對應的Class對象的常用的3種方式:
a) 使用Class類的靜態方法forName:Class.forName(「java.lang.String」);
b) 使用類的.class語法:String.class;
c) 使用對象的getClass()方法:String s = 「aa」; Class<?> clazz = s.getClass();
3. 若想通過類的不帶參數的構造方法來生成對象,我們有兩種方式:
a) 先獲得Class對象,然後通過該Class對象的newInstance()方法直接生成即可:
Class<?> classType = String.class;
Object obj = classType.newInstance();
b) 先獲得Class對象,然後通過該對象獲得對應的Constructor對象,再通過該Constructor對象的newInstance()方法生成:
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(new Class[]{});
Object obj = cons.newInstance(new Object[]{});
4. 若想通過類的帶參數的構造方法生成對象,只能使用下面這一種方式:
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});
Object obj = cons.newInstance(new Object[]{「hello」, 3});
5. Integer.TYPE返回的是int,而Integer.class返回的是Integer類所對應的Class對象。

閱讀全文

與java反射靜態方法相關的資料

熱點內容
優信二手車解壓後過戶 瀏覽:61
Windows常用c編譯器 瀏覽:778
關於改善國家網路安全的行政命令 瀏覽:833
安卓如何下載網易荒野pc服 瀏覽:654
javainetaddress 瀏覽:104
蘋果4s固件下載完了怎麼解壓 瀏覽:1002
命令zpa 瀏覽:285
python編譯器小程序 瀏覽:944
在app上看視頻怎麼光線調暗 瀏覽:540
可以中文解壓的解壓軟體 瀏覽:591
安卓卸載組件應用怎麼安裝 瀏覽:912
使用面向對象編程的方式 瀏覽:339
程序員項目經理的年終總結範文 瀏覽:929
內衣的加密設計用來幹嘛的 瀏覽:432
淮安數據加密 瀏覽:292
魔高一丈指標源碼 瀏覽:982
松下php研究所 瀏覽:168
c回調java 瀏覽:399
夢幻端游長安地圖互通源碼 瀏覽:745
電腦本地文件如何上傳伺服器 瀏覽:312