10.1.4 密封 包密封可以防止其他类加入包中。使用了密封之后,用户包名就不能与设定密封的包包名相同。 mf文件设置方式:Sealed: true MANIFEST.MF 配置 Manifest-Version: 1.0 Main-Class: com.dyy.jd
10.1.4 密封
包密封可以防止其他类加入包中。使用了密封之后,用户包名就不能与设定密封的包包名相同。
mf文件设置方式:Sealed: true
MANIFEST.MF 配置
Manifest-Version: 1.0Main-Class: com.dyy.jdk8.Main
Name: com/dyy/jdk8/
Sealed: true
Main文件测试代码:
package com.dyy.jdk8;public class Main {
public static void main(String[] args) {
Main solution = new Main();
}
@Override
public String toString() {
return "main";
}
}
jar cvfm testJ8.jar MANIFEST.MF com/dyy/jdk8/*.class
打包出来的文件,拷贝到随便一个位置(防止下次打包覆盖了)
换一个工程,导入jar包:
定义一个类继承包中的类
package com.dyy.jdk8;public class MySeal extends Main {
@Override
public String toString() {
return "123";
}
}package com.example.demo;
import com.dyy.jdk8.Main;
import com.dyy.jdk8.MySeal;
public class Test {
public static void main(String[] args){
//测试可以调用
System.out.println(new Main().toString());
//检查包密封性
Package pkg = Package.getPackage("com.dyy.jdk8");
boolean seal_status = pkg.isSealed();
System.out.println(seal_status);
//调用外部同名包
MySeal M = new MySeal();
}
}
产生安全异常,密封成功
PS:注意,如果外部建立同名类,会自动引用当前项目的包,不会产生安全异常。
加入下述类再测一次:
package com.dyy.jdk8;public class Main {
@Override
public String toString() {
return "outmain";
}
}