Method的invoke()方法的使用

本文通过具体实例演示了如何使用Java反射机制调用方法,包括无参方法、有参方法及返回不同类型值的方法,并展示了如何处理不同情况下的参数传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public Object invoke(Object obj,
                     Object... args)
              throws IllegalAccessException,
                     IllegalArgumentException,
                     InvocationTargetException

对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。

 

如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。

如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。 

如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。

如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。

obj - 从中调用底层方法的对象(简单的说就是调用谁的方法用谁的对象)args - 用于方法调用的参数 

package invoketest;

public class InvokeObj {
    public void show() {
	System.out.println("无参数show方法");
    }
    public void show(String name){
	System.out.println("show方法:"+name);
    }
    public String[] arrayShow(String[] arr){
	return arr;
    }
    public String StringShow(String str){
	return str;
    }
    public int intShow(int num){
	return num;
    }
}
package invoketest;

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

public class MethodInvokeTest {
    public static void main(String[] args) throws NoSuchMethodException,InvocationTargetException,IllegalAccessException {
        Class<InvokeObj> clazz=InvokeObj.class;
        //输出InvokeObj类的方法
        System.out.println("以下输出的InvokeObj类的方法");
        Method[] methods=clazz.getMethods();
        for(Method method:methods){
        	System.out.println(method);
        }
		
	//InvokeObj类的无参show()方法
	System.out.println("InvokeObj类的无参show()方法:");
	//getMethod方法中参数,第一个是方法名,第二个是方法名中的参数类型
	Method method1=clazz.getMethod("show", null);
	//会执行的无参show()方法
	Object object1=method1.invoke(new InvokeObj(), null);
	System.out.println("输出无参show()方法的返回值:"+object1);
		
	//会执行的InvokeObj类的show()方法
	System.out.println("InvokeObj类的show()方法:");
	Method method2=clazz.getMethod("show", String.class);
	//对InvokeObj类中的带参的show方法进行传值,值为Hello World
	Object object2=method2.invoke(new InvokeObj(), "Hello World");
	System.out.println("输出有参数的show()方法:"+object2);
		
	//InvokeObj类的arrayShow()方法:
	System.out.println("InvokeObj类的arrayShow()方法:");
	Method method3=clazz.getMethod("arrayShow", String[].class);
	String[] str1=new String[]{"Hello","World","!"};
	//数组类型的参数必须包含在new Object[]{}中,否则就会报IllegalAccessException异常
	String[] str2=(String[]) method3.invoke(new InvokeObj(),new Object[]{str1});
	for(String str : str2){
            System.out.println("arrayShow方法中的数组元素:"+str);
	}
		
	//InvokeObj类的StringShow()方法:
	System.out.println("InvokeObj类的StringShow()方法:");
	Method method4=clazz.getMethod("StringShow", String.class);
	String str3=(String) method4.invoke(new InvokeObj(), "thinking in java");
	System.out.println("StringShow()方法的返回值:"+str3);
		
	//InvokeObj类的intShow()方法:
	System.out.println("InvokeObj类的intShow()方法:");
	Method method5=clazz.getMethod("intShow", int.class);
	int num=(Integer) method5.invoke(new InvokeObj(), 89);
	System.out.println("intShow()方法的返回值:"+num);
    }
}
以下输出的InvokeObj类的方法
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public java.lang.String java.lang.Object.toString()
public void invoketest.InvokeObj.show()
public void invoketest.InvokeObj.show(java.lang.String)
public java.lang.String[] invoketest.InvokeObj.arrayShow(java.lang.String[])
public java.lang.String invoketest.InvokeObj.StringShow(java.lang.String)
public int invoketest.InvokeObj.intShow(int)
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
InvokeObj类的无参show()方法:
无参数show方法
输出无参show()方法的返回值:null
InvokeObj类的show()方法:
show方法:Hello World
输出有参数的show()方法:null
InvokeObj类的arrayShow()方法:
arrayShow方法中的数组元素:Hello
arrayShow方法中的数组元素:World
arrayShow方法中的数组元素:!
InvokeObj类的StringShow()方法:
StringShow()方法的返回值:thinking in java
InvokeObj类的intShow()方法:
intShow()方法的返回值:89

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值