Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';当JVM可以_Java_Ant_Jvm - Fatal编程技术网

Java 为什么可以';当JVM可以

Java 为什么可以';当JVM可以,java,ant,jvm,Java,Ant,Jvm,通过shell启动程序:java Main按预期工作,但通过ant启动程序: class Main { public static void main(String[] args) { .... } } JLS第12.3.3节符号参考的解析: IllegalAccessError:遇到一个符号引用 指定字段的使用或分配,或对 方法,或创建类的实例,代码 包含引用的内容没有访问权限,因为字段或 方法被声明为私有、受保护或默认访问(非 public),或者因为该类未

通过shell启动程序:
java Main
按预期工作,但通过ant启动程序:

class Main {
    public static void main(String[] args) {
        ....
    }
}
JLS第12.3.3节符号参考的解析:

IllegalAccessError:遇到一个符号引用 指定字段的使用或分配,或对 方法,或创建类的实例,代码 包含引用的内容没有访问权限,因为字段或 方法被声明为私有、受保护或默认访问(非 public),或者因为该类未声明为public

因此,
org.apache.tools.ant.taskdefs.ExecuteJava
无法执行该方法,因为它的封闭类是私有的,但是如果我用私有方法启动指向.class的jvm,它不会通过相同的安全机制吗


问题是类似的,但我仍然不明白

尝试向类添加公共修饰符,如下所示:

java.lang.IllegalAccessException: Class org.apache.tools.ant.taskdefs.ExecuteJava can not access a member of class Main with modifiers "public static"

答案就在你链接的问题中。当您通过JVM运行它时,无论访问级别如何,它都可以访问所有内容。当您通过ant运行它时,它本身就是另一个java程序,它必须遵守与任何其他程序相同的规则——这意味着它无法看到您的主方法

如果您将类声明为
public class Main
,则问题应该消失

至于jvm为什么在启动时做出允许访问私有类的决定,则是另一回事。按照规范

12.1.4调用Test.main

最后,在完成类测试的初始化之后(在 可能还有哪些其他相应的加载、链接和初始化 发生),调用测试的main方法。方法必须是main 声明为公共、静态和无效。它必须接受一个参数 这是一个字符串数组。此方法可以声明为

公共静态void main(字符串[]args)或公共静态void 主(字符串…参数)


这特别说明了该方法必须是
public
,但没有说明问题中的类,这就是为什么当您通过VM直接调用main时它会工作。

使用
公共访问修饰符

例如:

public class Main {
    public static void main(String[] args) {
        ....
    }
}

只需使用AntJava选项fork=“true”。请参阅Ant()中的java任务。
public class Main {
    public static void main(String[] args) {
        ....
    }
}
public class Main {
    public static void main(String[] args) {
        // Your code..
    }
}