A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尹震 中级黑马   /  2012-3-12 10:46  /  2019 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

用main方法进行反射AnnotationTest类,虽然main方法在AnnotationTest类里,但那是迫不得已,并不属于此类。那main方法具体属于哪个类呢。

@AnnotationInter
class AnnotationTest{
        public static void main(String[] args) {}

}

4 个回复

倒序浏览
他归JVM管的 呵呵
回复 使用道具 举报
main函数是一个程序的入口,也是出口,main函数其实就是类里的一个方法,方法只能在类里声明了,所以maion函数必须声明在一个类里,一个程序里只有一个main函数,因为类与类之间是相hu调用的

是一个特殊的函数。作为程序的入口,可以被JVM调用

回复 使用道具 举报
Main方法反射:有时候我们需要调用一个类的Main方法,也可说是执行这个类的代码。但是这时候这个类我们还没有写好,或者这个类是通过网络运行时传给我们的,我们就不可能在程序中知道我们将要运行的类的名字,这时候我们可以利用java的反射机制去调用main方法,只要在我们执行的时候,将我们需要执行的类的名字传递进去就可以了。这个方法在进行网络编程的时候,有时候我们需要接收一个类,我们只有等到接收到了才知道类的名字叫什么,显然现在在写程序不实际,我们就可以利用反射的方法。

  下面是一个例子程序:

  以下是代码片段:

  view plaincopy to clipboardprint?

  import java.lang.reflect.Method;

  public class CopyOfReflectMain

  {

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

  {

  //这个是我们知道类的名字情况下的调用方式

  Test1.main(new String[]{"abc","efg"});

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

  String m = args[0];

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

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

  //上面的语句不能正确执行,因为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);

  }

  }

  import java.lang.reflect.Method;

  public class CopyOfReflectMain

  {

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

  {

  //这个是我们知道类的名字情况下的调用方式

  Test1.main(new String[]{"abc","efg"});

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

  String m = args[0];

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

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

  //上面的语句不能正确执行,因为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

代码非个人手打 希望能帮到你
回复 使用道具 举报
主函数:是一个特殊的函数,作为程序的入口,可以被JVM调用。

主函数的定义:
public:代表着该函数访问权限的最大的。
static:代表主函数随着类的加载就已经存在了。
void:主函数没有具体的返回值。
main:不是关键字,但是是一个特殊的单词,可以被JVM识别。
(String[] args):函数的参数,参数类型是一个数组,该数组中的元素是字符串。字符串类型的数组。

主函数是固定格式的:JVM识别。       

JVM在调用主函数时,传入的是new String[0];
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马