V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhao1014
V2EX  ›  Java

这段代码怎么理解?

  •  
  •   zhao1014 · 2019-09-13 12:06:02 +08:00 · 5667 次点击
    这是一个创建于 1904 天前的主题,其中的信息可能已经有所发展或是发生改变。

    String name; if (args.length > 0) name = args[0];

    第 1 条附言  ·  2019-09-13 13:57:22 +08:00
    public static void main(String[] args) {

    //从命令行或用户输入中读取类名
    String name;
    if (args.length > 0) name = args[0];
    else {
    Scanner in = new Scanner(System.in);
    System.out.println("输入类名(e.g.java.util.Date):");
    name = in.next();
    }


    try {
    Class cl = Class.forName(name);//返回字符串 name 所对应的类的对象
    Class superCl = cl.getSuperclass();//返回父类的类对象
    String modifiers = Modifier.toString(cl.getModifiers());//getModifiers()返回一个用于描述构造器、方法或域的修饰符的整形数值
    //使用 Modifiers 类中的这个方法可以分析这个返回值
    //Modifiers.toString 返回对应修饰符的字符串表示
    if (modifiers.length() > 0) System.out.print(modifiers + "");
    System.out.print("类型" + name);
    if (superCl != null && superCl != Object.class) System.out.print("继承" + superCl.getName());

    System.out.print("\n{\n");
    printConstructors(cl);
    System.out.println();
    printMethod(cl);
    System.out.println();
    printFields(cl);
    System.out.println("}");

    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    System.exit(0);
    /*终止当前运行的 java 虚拟机,在一个 if-else 判断中,如果我们程序是按照我们预想的执行,
    到最后我们需要停止程序,那么我们使用 System.exit(0),
    而 System.exit(1)一般放在 catch 块中,当捕获到异常,
    需要停止程序,我们使用 System.exit(1)。*/


    附上主函数代码,这是我学反射的时候 core java 中的代码示例,程序的功能是打印一个类的全部信息。
    目前就是不理解 if (args.length > 0) name = args[0];这一段的含义,为什么要这么写?
    既然是读取类名直接 {
    Scanner in = new Scanner(System.in);
    System.out.println("输入类名(e.g.java.util.Date):");
    name = in.next();
    }不就好了?为什么还要判断一下 args.length>0 ?
    有关 args 的内容我搜了一些博客看,但目前还是云里雾里的感觉?
    能否请大牛们帮忙解读一下?感激不尽!
    16 条回复    2019-09-13 14:45:35 +08:00
    zhao1014
        1
    zhao1014  
    OP
       2019-09-13 12:07:26 +08:00
    注释是从命令行参数读取类名,但是我不懂为什么会这么写,还请大佬们赐教。
    codingadog
        2
    codingadog  
       2019-09-13 12:09:51 +08:00 via Android
    这是命令行执行的时候,main 方法里读取第一个参数吧
    lhx2008
        3
    lhx2008  
       2019-09-13 12:11:30 +08:00 via Android
    换下行就可以看懂了,arg[0] 一般是程序自己
    gIrl1990
        4
    gIrl1990  
       2019-09-13 12:14:40 +08:00
    ??? 这能读取到吗? args[0]不是第一个参数吗?
    zcmxw1
        5
    zcmxw1  
       2019-09-13 12:19:54 +08:00 via Android
    没有参数时的,防止报错吧?
    fzdfengzi
        6
    fzdfengzi  
       2019-09-13 12:25:45 +08:00 via iPhone
    main 函数的参数 args 接受输入参数。好像没毛病
    CEBBCAT
        7
    CEBBCAT  
       2019-09-13 12:29:06 +08:00
    name 永远赋值为可执行文件的文件名吧,因为 args 一般至少有一个参数,就是程序自己的文件名
    fishCatcher
        8
    fishCatcher  
       2019-09-13 12:49:48 +08:00 via iPhone   ❤️ 1
    从回复来看我站的水平有待提高啊?
    GrayXu
        9
    GrayXu  
       2019-09-13 12:58:10 +08:00
    请问 java 如何运行程序?不就是 java <public class name>嘛。。
    所以读取类名没毛病
    Creamliu
        10
    Creamliu  
       2019-09-13 12:59:36 +08:00 via Android
    这是赋值入参的第一个参数
    zhao1014
        11
    zhao1014  
    OP
       2019-09-13 13:58:52 +08:00
    @CEBBCAT @Creamliu @GrayXu @codingadog @fishCatcher @fzdfengzi @gIrl1990 @lhx2008 @zcmxw1
    主函数已上传附言,麻烦大家了!
    ffkjjj
        12
    ffkjjj  
       2019-09-13 14:06:13 +08:00
    args[0] 就是启动的时候读取命令行传的参数啊。。如果没有传就会提示你手动输入一个
    比如 java Test 123
    args[0] //123
    ffkjjj
        13
    ffkjjj  
       2019-09-13 14:07:12 +08:00
    @CEBBCAT java 中 args[] 应该不包括文件本身
    Sharuru
        14
    Sharuru  
       2019-09-13 14:07:35 +08:00 via Android
    注释里不是写了从命令行或用户输入获得参数了吗?
    args 就是你命令行的传入参数。
    比如程序叫 tools.jar ,if 里的语句就是为以下运行场景(命令行)服务的:java -jar tools.jar sample.class,此时 args0 就是 sample.class
    如果你这样(用户输入)运行:java -jar tools.jar
    那么,else 语句就会起效,等待用户输入 className
    zhao1014
        15
    zhao1014  
    OP
       2019-09-13 14:34:28 +08:00 via Android
    @Sharuru 懂了😂,谢谢大佬!
    gIrl1990
        16
    gIrl1990  
       2019-09-13 14:45:35 +08:00
    “从命令行或用户输入中读取类名” 他这个“类名”不是你当前启动程序的类名。
    比如你运行 java ClassA 这个类名不是 ClassA。
    而是指你输入后拿去反射用的类名 比如你运行 java ClassA ClassB 那就是指 ClassB
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4799 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 09:55 · PVG 17:55 · LAX 01:55 · JFK 04:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.