Java 把我的班级放到其他人中去';s包访问包可见方法?

Java 把我的班级放到其他人中去';s包访问包可见方法?,java,packages,access-modifiers,Java,Packages,Access Modifiers,我不理解这肯定不是一个好的实践,但是Java是否提供了任何机制来阻止访问包私有方法/属性?如果不是,这是否意味着: package com.other_people_other_company; public class MyClass { // Let's hack! Access all package privates } 有效吗 编辑: 答案中提到: Name: myCompany/myPackage/ Sealed: true 这对我来说是新信息。但如果我通过分发一罐我的,并

我不理解这肯定不是一个好的实践,但是Java是否提供了任何机制来阻止访问包私有方法/属性?如果不是,这是否意味着:

package com.other_people_other_company;

public class MyClass {
  // Let's hack! Access all package privates
}
有效吗

编辑: 答案中提到:

Name: myCompany/myPackage/
Sealed: true

这对我来说是新信息。但如果我通过分发一罐我的,并在那里密封其他人的包裹来破坏呢?例如,
Name:org.apache Sealed:true
是的,没错。基于这个想法,某种“补丁”方法是基于这样的:当您必须修复3d party库中的某些bug时,您可以在类路径中使用相同的类创建相同的包,并创建固定的类

唯一的一个限制是特殊的包名,如
java.util
,例如,尽管
java.util.Tripwire
类具有包本地访问修饰符,但此示例将成功编译:

package java.util;

public class TestTripwire {
    public static void main(String[] args) {
        Tripwire.trip(Object.class, "sss");
    }
}

但是如果您运行它,您将在线程“main”java.lang.SecurityException中获得异常
异常:禁止的包名称:java.util
假设.JAR分布,您可以通过将以下行添加到
META-INF/MANIFEST.MF

Name: myCompany/myPackage/
Sealed: true
请注意:

  • 每个包都需要自己的条目
  • 这并不能阻止狡猾的人从清单文件中剥离行并在内部重新分发。如果这是一个问题,您可能需要研究一些自验证技术,例如在密封的包中强制执行类,以检查清单是否保持不变

你试过了吗,你能做到吗?我得到了第一点,那就是它通常确实是可能的,并用于创建补丁。对于第二部分,其中一些包是“禁止的”,您是否有任何关于该部分的参考/JLS部分?它看起来不那么整洁或标准。这对我来说是新的信息。但如果我通过分发一罐我的,并在那里密封其他人的包裹来破坏呢?例如,
Name:org.apache Sealed:true
@Charles,正是由于这个原因,这个系统还远远不够完美。我相信Java9的模块系统将与这个特定的问题作斗争,但我还没有以我可以肯定的方式研究它。