本文目錄一覽:
java反射調用方法可以傳非基本類型嗎?如對象、介面
可以的,參數類型是沒有限制的。通過以下代碼可以證明。
介面:
public interface MyInterface {
void print();
}
實現類:
public class MyInterfaceImpl implements MyInterface {
@Override
public void print() {
System.out.println(“interfaceImpl”);
}
}
通過反射調用方法:
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Test instance = Test.class.newInstance();
Method method = Test.class.getDeclaredMethod(“test”, MyInterface.class);
MyInterface myInterface = new MyInterfaceImpl();
method.invoke(instance, myInterface);
}
public void test(MyInterface myInterface) {
myInterface.print();
}
}
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反射的測試類”);
}
}
關於用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,該方法不返回結果
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/156413.html