框架(Framework)、类库(Class Library)和JNI(Java Native Interface)是Java语言中的三个不同的概念,在我们学习Java的不同阶段出现,但它们都有一个共同的特征:允许调用已封装(或编译)好的代码。
框架
框架是框架构建者提供的一套半成品代码,为解决问题制定了一套约束,并提供了API,在提供功能的基础上可进行扩充,一般以jar包的形式存在。
框架将我们在项目构建的过程中会需要重复或必要的一些代码逻辑进行抽象和封装,对于应用场景中不能进行封装的“变量”(例如数据库路径、账号、密码等),就需要构建一个或多个xml文件进行配置。
框架中最重要的技术就是xml解析和反射技术。
对框架的理解可以联想到我们考试中的“填空题”,在一段写好主干的题目中的关键地方填上我们自己的答案。
我们可以组合使用不同功能的框架来构建我们的项目,将需要依赖的框架导入到我们的项目中,然后在框架的基础上进行业务代码的编写,从而能够使我们快速的进行项目开发,提升开发效率,例如我们常用的SSM框架(Spring、SpringMVC、Mybatis)和SSH框架(Struts、Spring、Hibernate)。
类库
类库(Class Library)不同于框架,框架是更高层次的概念,而类库是我们在基础编程的过程中都将用到的API。
从它的名字中我们能知道,类库是一系列类的集合,它们包括接口、抽象类和具体类。是Java语言提供的一些完成基础、偏底层的代码实现,通常以jar包的形式存在,jdk和jre中都包含了Java的基础类库。
类库有点类似于我们以前为写作文积累的名言警句,可以不加修改的直接在作文中引用。
Java语言提供了提供了丰富的类库和API文档以及第三方开发包,许多的方法不需要我们自己去实现只需要调用Java类库中的类和方法即可,这大大降低了编程的难度,减少了程序员的代码量。
JNI技术
JNI,Java Native Interface,即Java本地接口,我们可以通过JNI技术与其他编程语言进行交互,例如C/C++、汇编语言等,并且与硬件、操作系统进行交互。我们都知道Java的一个缺点是不适合进行底层开发,JNI技术弥补了这一缺陷。
在Java的基础类库中需要与操作系统交互的API中也大量的用到了JNI技术,最常见的莫过于Java中多线程的实现了。
Java中线程的启动,即Thread类中的start0()就是native方法。start0()方法需要与操作系统进行交互,而操作系统有多种(Windows、Linux等),同样线程的启动也有许多不同的实现方式。这就需要利用Java虚拟机利用JNI技术来匹配调用不同操作的底层函数的算法来操作计算机的资源,这保证了Java代码可以在不同平台进行移植。如下图所示。
另外,我们也可以与本地已编译的C/C++代码进行编译,Java可以加载编译好的动态链接库(DLL文件),来调用动态链接库中的C/C++代码。
由于C/C++代码不具有不同平台的可移植性,所以可能会使我们的Java程序丧失平台可移植性,我们应当将所有的本地方法接口都封装在单个类中,通过这个类来加载DLL,降低了Java应用与DLL的耦合,我们可以轻松、灵活的替换为不同平台编译好的DLL。
例如:
public class NativeDemo {
{
/**
* 系统加载其他的语言的函数
*/
System.load("C:\\Users\\Administrator\\Desktop\\com\\Hello.dll");
}
/**
* 就这个native关键字.标记了这个接口,看起来像是abstract
*/
public native void sayHello();
}
具体JNI技术的使用可参考:https://www.runoob.com/w3cnote/jni-getting-started-tutorials.html