Package-private class within a .java file - why is it accessible?

前端 未结 4 1320
春和景丽
春和景丽 2020-12-17 06:19

Consider the following code, where the HelloWorld class has default or package-private access:

class HelloWorld {
    public static void main(St         


        
相关标签:
4条回答
  • 2020-12-17 06:31

    JVM startup is described in §12.1 Virtual Machine Start-Up of the JLS.

    Note that this chapter says nothing about visibility checks with regards to the class. It only specifies that the main method must be public.

    This means that there simply is no check for visibility on the class level (which kind-of makes sense as there is no context yet against which to check the visibility: in which "package" is the "caller"?).

    0 讨论(0)
  • 2020-12-17 06:36

    You have not made it very clear, but I assume that your question is why that main method can be run when you type java HelloWorld at the command line.

    The answer is that the Java Language Specification simply does not require the class that contains the main method to be public. Access modifiers are a language mechanism mainly intended to help maintainability via encapsulation. They're not really a security feature, and certainly not unshakable laws of physics. The JVM startup mechanism simply ignores them.

    In fact, you can even use a private inner class, and it will still run.

    0 讨论(0)
  • 2020-12-17 06:41

    Main method won't be visible to other classes which reside in different packages. But the JVM can see it all. It won't have any difficulty in finding your main method and running it for you.

    If you want to simulate the access restriction, write another class in a different package and try to call HelloWorld.main and see if the compiler keeps quiet.

    0 讨论(0)
  • 2020-12-17 06:47

    Probably the designers of JLS decided there is no need to restrict access to main method if you know the class name, while at the first glance it looks counter-intuitive; from the other side - the access could be always got via reflection so it couldn't be treated as a security hole... Anyway e.g. by creating facade to a package-private class we access that one indirectly... So the protection is rather from incorrect usage and to allow further changes.

    0 讨论(0)
提交回复
热议问题