代码之家  ›  专栏  ›  技术社区  ›  Boyang

将我的类放入其他人的包中以访问包可见的方法?

  •  2
  • Boyang  · 技术社区  · 9 年前

    我不理解这当然不是一个好的实践,但是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 回复  |  直到 9 年前
        1
  •  2
  •   Esko    9 年前

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

    Name: myCompany/myPackage/
    Sealed: true
    

    几点注意事项

    • 每个包都需要自己的条目。
    • 这并不妨碍狡猾的人从清单文件中删除行并在内部重新分发。如果这是一个问题,您可能需要研究一些自我验证技术,例如在密封的包中强制执行类,以检查清单是否未被修改。
        2
  •  0
  •   Andremoniy    9 年前

    是的,这是真的。基于这个想法,某种“补丁”方法是基于此的:当你必须修复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");
        }
    }
    

    但如果你运行它,你会得到例外 Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util