把我的课程放到其他人的包中以访问包可见方法?

时间:2016-01-17 08:07:46

标签: 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

这是我的新信息。但是,如果我通过分发我的罐子并在那里密封其他人的包装来破坏呢?例如。 Name: org.apache Sealed: true

2 个答案:

答案 0 :(得分:2)

假设.JAR分发,您可以seal the packagesMETA-INF/MANIFEST.MF添加以下行:

Name: myCompany/myPackage/
Sealed: true

一些注意事项:

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

答案 1 :(得分:0)

是的,这是真的。在这个想法上某种"补丁"方法基于:当您必须修复3d-party库中的某些错误时,您可以在类路径中创建具有相同类的相同包,并创建固定类。

唯一的限制是特殊包名称,例如java.util,例如尽管java.util.Tripwire类具有包本地访问修饰符:

,但此示例将成功编译
package java.util;

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

但是如果你运行它,你将获得异常Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util