把我的class放到别人的包里,访问包可见的方法?

Put my class into other people's package to access package visible methods?

我理解这当然不是一个好的做法,但是 Java 是否提供任何机制来 防止 访问 package-private methods/attributes?如果不是,是不是这个意思:

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

是的,没错。基于这个想法,某种 "patch" 方法是基于:当你必须修复 3d 方库中的一些错误时,你可以在你的 class 路径中创建具有相同 class 的相同包并创建固定class.

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

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

假设 .JAR 分发,您可以 seal the packages 通过将以下行添加到 META-INF/MANIFEST.MF:

Name: myCompany/myPackage/
Sealed: true

一些注意事项:

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