这段代码怎么理解? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhao1014
V2EX    Java

这段代码怎么理解?

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

    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
    注释是从命令行参数读取类名,但是我不懂为什么会这么写,还请大佬们赐教。
    Duolingo
        2
    Duolingo  
       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     Solana     2596 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 08:23 PVG 16:23 LAX 01:23 JFK 04:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86