反射调用main方法

本文通过一个实例展示了如何使用Java反射机制调用main方法,解析了在JDK1.4和1.5中传参的区别,并给出了正确的调用方式。

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

 ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

用到了反射调用main方法,那么应该明白了反射机制,就不多说明了,直接说调用main方法的步骤了;

步骤和反射调用普通方法的步骤一样,主要是类名和方法参数类型不一样:



下面是一个例子程序:

import java.lang.reflect.Method; 

public class CopyOfReflectMain 


   public static void main(String[] args) throws Exception 

  {

       //程序运行时候传递的第一个参数 我们人为是类的名字


        String m = args[0];  //注意:第一个不同之处(其实这个就是类名和普通方法不一样)


        Method mainMethod = Class.forName(m).getMethod("main",String[].class) ; 


          //      mainMethod.invoke(null,new String[]{"abc","efg"});  注:第二个不同之处,JDK1.4主方法处理传递参数和1.5的不同,下面详细说明


        //上面的语句不能正确执行,因为Test1中的参数是需要一个String数组,但是在jdk中接收到之后将数组


        //拆开之后再分别作为参数传递给Test1,既然它拆包我们就再包一层如下,就可以正确执行了


        mainMethod.invoke(null, new Object[]{new String[]{"abc","efg"}}); 


        //还可以使用下面的方法, 


        mainMethod.invoke(null, (Object)new String[]{"abc","efg"}); 


    } 




 class Test1 



   public static void main(String[] args) 
  { 

        for(String str:args ) 


            System.out.println(str); 


    } 





 上面的程序执行的时候在Eclipse里面需要配置,在运行配置中的程序参数中需要加上Test1然后运行会出现如下的结果:


abc 
efg 
abc 
efg 
abc 
efg 

 这里解释一下 (Object)new String[]{"abc","efg"}; 这段代码。
    启动Java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射方式来调用这个main方法时,如何为invoke方法设置参数呢?
    按jdk 1.5的语法,由于使用的是可变参数(Object类型),设置的数组参数会被作为一个参数进行传递,而按jdk 1.4的语法,此处应设置一个Object数组,数组中的每个元素对应所调用方法的一个参数。
    当把一个字符串数组作为参数传递给invoke方式时,编译器会兼容jdk 1.4的语法,即按照1.4的语法进行处理,即把字符串数组打散成为若干个单独的参数,这样就会产生参数个数不匹配的异常。
 
    解决方法:采用上述强制向上转型后,可以是编译器按照正确的方法进行参数处理,即将整个字符串参数作为整体传递给目标main方法。
 
    注:使用new Object[]{new String[]{"abc","efg"};}作为invoke方法的第二个参数也可以得到正
确的结果。比如在目标main方法中便利字符串数组元素。

 ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值