用反射方式执行某个类中的main方法

本文探讨了如何不使用反射以及使用反射调用Java类的main方法,详细阐述了反射在调用main方法中的应用。

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

1、目标
写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。用普通方式调完后,大家要明白为什么要用反射方式去调用啊?
2、问题
启动Java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?按JDK1.5的语法,整个数组是一个参数,而按JDK1.4的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac到底会按照哪种语法进行处理呢?JDK1.5肯定要兼容JDK1.4的语法,会按JDK1.4的语法进行处理,即把数组打散成为若干个单独的参数。所以,在给main方法传递参数时,不能使用代码mainMethod.invoke(null, new String[]{“XXX”}),javac只把它当作JDK1.4的语法进行理解,而不把它当作JDK1.5的语法解释,因此会出现参数类型不对的问题。
3、解决办法
mainMethod.invoke(null, new Object[]{new String[]{“XXX”}});
mainMethod.invoke(null, (Object)new String[]{“XXX”});,编译器会作特殊处理,编译时不把参数当作数组看待,也就不会将数组打散成若干个参数了。

4、不使用反射调用main方法

package cn.sunft.day01.reflect;

public class Test {

	public static void main(String[] args) {
		TestArguments.main(new String[]{"111", "222", "333"});
	}

}

class TestArguments {
	public static void main(String[] args) {
		for (String arg : args) {
			System.out.println(arg);
		}
	}
}

5、使用反射的方式调用

package cn.sunft.day01.reflect;

import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) throws Exception {
		//TestArguments.main(new String[]{"111", "222", "333"});
		//使用反射的方式调用,这里的args[0]是通过MyEclipse配置的参数
		String startingClassName = args[0];
		Method mainMethod = Class.forName(startingClassName)
				.getMethod("main", String[].class);
		//因为main是静态方法,所以invoke第一个参数是null
		//mainMethod.invoke(null, new Object[]{new String[]{"111", "222", "333"}});
		//上面一行也可以
		mainMethod.invoke(null, (Object)new String[]{"111", "222", "333"});
	}

}

class TestArguments {
	public static void main(String[] args) {
		for (String arg : args) {
			System.out.println(arg);
		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值