本文目錄一覽:
關於用java反射調用一個類裏面的方法並執行
Java中要用到反射,首先就必須要獲取到對應的class對象,在Java中有三種方法獲取類對應的class對象。
1、通過類的.class屬性
2、通過類實例的getClass()方法獲取
3、通過Class.forName(String className)方法獲取
現在比如在package下有個類Calculator
public class Calculator{
public double add(double score1,double score2){
return score1 + score2;
}
public void print(){
System.out.println(“OK”);
}
public static double mul(double score1,double score2){
return score1 * score2;
}
}
public class CalculatorTest {
public static void main(String[] args) throws Exception {
//通過類的.class屬性獲取
ClassCalculator clz = Calculator.class;
//或者通過類的完整路徑獲取,這個方法由於不能確定傳入的路徑是否正確,這個方法會拋ClassNotFoundException
// ClassCalculator clz = Class.forName(“test.Calculator”);
//或者new一個實例,然後通過實例的getClass()方法獲取
// Calculator s = new Calculator();
// ClassCalculator clz = s.getClass();
//1. 獲取類中帶有方法簽名的mul方法,getMethod第一個參數為方法名,第二個參數為mul的參數類型數組
Method method = clz.getMethod(“mul”, new Class[]{double.class,double.class});
//invoke 方法的第一個參數是被調用的對象,這裡是靜態方法故為null,第二個參數為給將被調用的方法傳入的參數
Object result = method.invoke(null, new Object[]{2.0,2.5});
//如果方法mul是私有的private方法,按照上面的方法去調用則會產生異常NoSuchMethodException,這時必須改變其訪問屬性
//method.setAccessible(true);//私有的方法通過發射可以修改其訪問權限
System.out.println(result);//結果為5.0
//2. 獲取類中的非靜態方法
Method method_2 = clz.getMethod(“add”, new Class[]{double.class,double.class});
//這是實例方法必須在一個對象上執行
Object result_2 = method_2.invoke(new Calculator(), new Object[]{2.0,2.5});
System.out.println(result_2);//4.5
//3. 獲取沒有方法簽名的方法print
Method method_3 = clz.getMethod(“print”, new Class[]{});
Object result_3 = method_3.invoke(new Calculator(), null);//result_3為null,該方法不返回結果
}
}
java 反射調用方法有什麼用
首先你要明白反射機制可以用來做什麼
Java反射的功能
1)可以判斷運行時對象所屬的類
2)可以判斷運行時對象所具有的成員變量和方法
3)通過反射甚至可以調用到private的方法
4)生成動態代理
java 反射 方法調用
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
JAVA反射(放射)機制:「程序運行時,允許改變程序結構或變量類型,這種語言稱為動態語言」。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。但是JAVA有着一個非常突出的動態相關機制:Reflection,用在Java身上指的是我們可以於運行時加載、探知、使用編譯期間完全未知的classes。換句話說,Java程序可以加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其對象實體、或對其fields設值、或喚起其methods。
說白了就是調用這個累的.Class方法然後調用其屬性和方法。
java反射方法調用問題
int是基本類型沒錯,因此,在用反射調用時,應明確使用Integer才行。
由於參數是從數據庫里來的(ResultSet),因此,要看數據庫的定義,以及數據庫的類型。
比如,對於Oracle 定義的任何數值類型字段,都會返回Decimal對象,由於float類型能運行,推斷應該不使用的ORACLE,還是看你的數據庫定義吧,實在不行,就要做下面的工作,增加一個TypeConvertor定義,其中實現將數據庫返回的對象轉換成方法參數所需的類型,針對幾種基本數據類型進行簡單的轉換,就不需要依賴數據庫了。
1樓的是想自己做持久類框架??
java 反射機制的幾個調用方法
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
/**
* Created by IntelliJ IDEA.
* File: TestRef.java
* User: leizhimin
* 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反射的測試類”);
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/182333.html