《Java 核心技术 卷1》 笔记 第10章 部署应用程序和applet(3) jar包密封与测试_ide

 

10.1.4 密封

包密封可以防止其他类加入包中。使用了密封之后,用户包名就不能与设定密封的包包名相同。

mf文件设置方式:Sealed: true

MANIFEST.MF 配置

Manifest-Version: 1.0
Main-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";
}
}

《Java 核心技术 卷1》 笔记 第10章 部署应用程序和applet(3) jar包密封与测试_开发语言_02

 

jar cvfm testJ8.jar MANIFEST.MF   com/dyy/jdk8/*.class

《Java 核心技术 卷1》 笔记 第10章 部署应用程序和applet(3) jar包密封与测试_java_03

打包出来的文件,拷贝到随便一个位置(防止下次打包覆盖了)

换一个工程,导入jar包:

《Java 核心技术 卷1》 笔记 第10章 部署应用程序和applet(3) jar包密封与测试_jar_04

定义一个类继承包中的类

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();
}
}

《Java 核心技术 卷1》 笔记 第10章 部署应用程序和applet(3) jar包密封与测试_jar_05

产生安全异常,密封成功

PS:注意,如果外部建立同名类,会自动引用当前项目的包,不会产生安全异常。

加入下述类再测一次:

package com.dyy.jdk8;

public class Main {
@Override
public String toString() {
return "outmain";
}
}

《Java 核心技术 卷1》 笔记 第10章 部署应用程序和applet(3) jar包密封与测试_开发语言_06