Java 把我的班级放到其他人中去';s包访问包可见方法?
我不理解这肯定不是一个好的实践,但是Java是否提供了任何机制来阻止访问包私有方法/属性?如果不是,这是否意味着: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 这对我来说是新信息。但如果我通过分发一罐我的,并
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
请注意:
- 每个包都需要自己的条目
- 这并不能阻止狡猾的人从清单文件中剥离行并在内部重新分发。如果这是一个问题,您可能需要研究一些自验证技术,例如在密封的包中强制执行类,以检查清单是否保持不变
Name:org.apache Sealed:true
@Charles,正是由于这个原因,这个系统还远远不够完美。我相信Java9的模块系统将与这个特定的问题作斗争,但我还没有以我可以肯定的方式研究它。