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

java反射方法調用靜態方法

發布時間:2022-04-18 08:42:46

『壹』 java如何反射調用靜態方法

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

『貳』 Java 中Class.forName()動態調用類中靜態方法的問題

你可以使用Class.getMethod()方法,然後使用Method.invoke()進行方法調用

『叄』 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();}

『肆』 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 反射機制的幾個調用方法

import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

/**
* Created by IntelliJ IDEA.
* File: TestRef.java
* User: leimin
* Date: 2008-1-28 14:48:44
*/
public class TestRef {

public staticvoid main(String args[]) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
Foo foo = new Foo("這個一個Foo對象!");
Class clazz = foo.getClass();
Method m1 = clazz.getDeclaredMethod("outInfo");
Method m2 = clazz.getDeclaredMethod("setMsg", String.class);
Method m3 = clazz.getDeclaredMethod("getMsg");
m1.invoke(foo);
m2.invoke(foo, "重新設置msg信息!");
String msg = (String) m3.invoke(foo);
System.out.println(msg);
}
}

class Foo {
private String msg;

public Foo(String msg) {
this.msg = msg;
}

public void setMsg(String msg) {
this.msg = msg;
}

public String getMsg() {
return msg;
}

public void outInfo() {
System.out.println("這是測試Java反射的測試類");
}
}

『陸』 如何通過反射調用靜態私有方法,我用下面方法為什麼報錯

你的方法是如何的呢,看不到代碼呢
唯一區別就是setAccessible
~~~~~~~~~
~~~~~~~~~~~~~~~~~
~~~~

『柒』 java反射方法調用問題

int是基本類型沒錯,因此,在用反射調用時,應明確使用Integer才行。
由於參數是從資料庫里來的(ResultSet),因此,要看資料庫的定義,以及資料庫的類型。
比如,對於Oracle 定義的任何數值類型欄位,都會返回Decimal對象,由於float類型能運行,推斷應該不使用的ORACLE,還是看你的資料庫定義吧,實在不行,就要做下面的工作,增加一個TypeConvertor定義,其中實現將資料庫返回的對象轉換成方法參數所需的類型,針對幾種基本數據類型進行簡單的轉換,就不需要依賴資料庫了。

1樓的是想自己做持久類框架??

『捌』 JAVA中反射是什麼

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

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

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

(8)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中要用到反射,首先就必須要獲取到對應的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,該方法不返回結果
}
}
閱讀全文

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

熱點內容
安卓qq瀏覽器怎麼轉換到ios 瀏覽:292
不同編譯器的庫可以調用嗎 瀏覽:455
灰度信託基金加密 瀏覽:421
宿遷程序員兼職網上接單 瀏覽:924
電視編譯器怎麼設置 瀏覽:276
手機如何解壓漢字密碼的壓縮包 瀏覽:701
為什麼很多程序員愛用vim 瀏覽:828
安卓手機怎麼連接寶華韋健音響 瀏覽:555
12星座製作解壓球 瀏覽:867
java調用oracle數據 瀏覽:827
怎麼在伺服器上上傳小程序源碼 瀏覽:304
空中加油通達信指標公式源碼 瀏覽:38
分卷解壓只解壓了一部分 瀏覽:760
php網站自動登錄 瀏覽:705
合肥凌達壓縮機招聘 瀏覽:965
怎麼找到文件夾的圖標 瀏覽:235
linuxc編程pdf百度雲 瀏覽:190
會計pdf下載 瀏覽:833
c開源cf源碼 瀏覽:951
如何取消掉添加進app資源庫 瀏覽:732