文档库 最新最全的文档下载
当前位置:文档库 › Java 本地接口规范

Java 本地接口规范

Java 本地接口规范
Java 本地接口规范

目录

1. 简介

Java 本地接口概述

背景

JDK 1.0 本地方法接口

Java 运行时接口

原始本地接口和Java/COM 接口

目标

Java 本地接口方法

利用JNI 编程

JDK 1.1.2 中的变化

2. 设计概述

JNI 接口函数和指针

加载和链接本地方法

解析本地方法名

本地方法的参数

引用Java 对象

全局和局部引用

实现局部引用

访问Java 对象

访问基本类型数组

访问域和方法

报告编程错误

Java 异常

异常和错误代码

异步异常

异常的处理

3. JNI 的类型和数据结构

基本类型

引用类型

域ID 和方法ID

值类型

类型签名

UTF-8 字符串

4. JNI 函数

接口函数表

版本信息

GetVersion

类操作

DefineClass

FindClass

GetSuperclass IsAssignableFrom

异常

Throw

ThrowNew ExceptionOccurred ExceptionDescribe ExceptionClear

FatalError

全局及局部引用NewGlobalRef DeleteGlobalRef DeleteLocalRef

对象操作

AllocObject

GetObjectClass IsInstanceOf IsSameObject

访问对象的域

GetFieldID

GetField 例程

SetField 例程

调用实例方法GetMethodID

CallMethod CallNonvirtualMethod

访问静态域

GetStaticFieldID

GetStaticField 例程

SetStaticField 例程

调用静态方法

GetStaticMethodID

CallStaticMethod

字符串操作

NewString

GetStringLength

GetStringChars

ReleaseStringChars

NewStringUTF

GetStringUTFLength GetStringUTFChars ReleaseStringUTFChars

数组操作

GetArrayLength

NewObjectArray GetObjectArrayElement SetObjectArrayElement

NewArray 例程

GetArrayElements 例程ReleaseArrayElements 例程GetArrayRegion 例程

SetArrayRegion 例程

注册本地方法

RegisterNatives

UnregisterNatives

监视程序操作

MonitorEnter

MonitorExit

Java 虚拟机接口

GetJavaVM

5. 调用API

概述

创建虚拟机

连接虚拟机

卸载虚拟机

初始化结构

调用API 函数

JNI_GetDefaultJavaVMInitArgs

JNI_GetCreatedJavaVMs

JNI_CreateJavaVM

DestroyJavaVM

AttachCurrentThread

DetachCurrentThread

1 - 简介

本章介绍Java 本地接口(Java Native Interface,JNI)。JNI 是本地编程接口。它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行互操作。

JNI 最重要的好处是它没有对底层 Java 虚拟机的实现施加任何限制。因此,Java 虚拟机厂商可以在不影响虚拟机其它部分的情况下添加对 JNI 的支持。程序员只需编写一种版本的本地应用程序或库,就能够与所有支持 JNI 的 Java 虚拟机协同工作。

本章论及以下主题:

?Java 本地接口概述

?背景

?目标

?Java 本地接口方法

?利用JNI 编程

?JDK 1.1.2 中的变化

Java 本地接口概述

尽管可以完全用 Java 编写应用程序,但是有时单独用 Java 不能满足应用程序的需要。程序员使用 JNI 来编写Java 本地方法,可以处理那些不能完全用Java 编写应用程序的情况。

以下示例说明了何时需要使用 Java 本地方法:

?标准Java 类库不支持与平台相关的应用程序所需的功能。

?已经拥有了一个用另一种语言编写的库,而又希望通过JNI 使Java 代码能够访问该库。

?想用低级语言(如汇编语言)实现一小段时限代码。

通过用 JNI 编程,可以将本地方法用于:

?创建、检查及更新Java 对象(包括数组和字符串)。

?调用Java 方法。

?捕捉和抛出异常。

?加载类和获得类信息。

?执行运行时类型检查。

也可以与调用 API一起使用 JNI,以允许任意本地应用程序嵌入到 Java 虚拟机中。这样使得程序员能够轻易地让已有应用程序支持 Java,而不必与虚拟机源代码相链接。

背景

目前,不同厂商的虚拟机提供了不同的本地方法接口。这些不同的接口使程序员不得不在给定平台上编写、维护和分发多种版本的本地方法库。

下面简要分析一下部分已有本地方法接口,例如:

?JDK 1.0 本地方法接口

?Netscape 的Java 运行时接口

?Microsoft 的原始本地接口和Java/COM 接口

JDK 1.0 本地方法接口

JDK 1.0 附带有本地方法接口。遗憾的是,有两点原因使得该接口不适合于其它Java 虚拟机。

第一,平台相关代码将 Java 对象中的域作为 C 结构的成员来进行访问。但是,Java 语言规范没有规定在内存中对象是如何布局的。如果 Java 虚拟机在内存中布局对象的方式有所不同,程序员就不得不重新编译本地方法库。

第二,JDK 1.0 的本地方法接口依赖于保守的垃圾收集器。例如,无限制地使用unhand 宏使得有必要以保守方式扫描本地堆栈。

Java 运行时接口

Netscape 建议使用 Java 运行时接口 (JRI),它是 Java 虚拟机所提供服务的通用接口。JRI 的设计融入了可移植性---它几乎没有对底层 Java 虚拟机的实现细节作任何假设。JRI 提出了各种各样的问题,包括本地方法、调试、反射、嵌入(调用)等等。

原始本地接口和Java/COM 接口

Microsoft Java 虚拟机支持两种本地方法接口。在低一级,它提供了高效的原始本地接口 (RNI)。RNI 提供了与 JDK 本地方法接口有高度源代码级的向后兼容性,尽管它们之间还有一个主要区别,即平台相关代码必须用 RNI 函数来与垃圾收集器进行显式的交互,而不是依赖于保守的垃圾收集。

在高一级,Microsoft 的 Java/COM 接口为 Java 虚拟机提供了与语言无关的标准二进制接口。Java 代码可以象使用 Java 对象一样来使用 COM 对象。Java 类也可以作为 COM 类显示给系统的其余部分。

目标

我们认为统一的,经过细致考虑的标准接口能够向每个用户提供以下好处: 每个虚拟机厂商都可以支持更多的平台相关代码。

?工具构造器不必维护不同的本地方法接口。

?应用程序设计人员可以只编写一种版本的平台相关代码就能够在不同的虚拟机上运行。

获得标准本地方法接口的最佳途径是联合所有对 Java 虚拟机有兴趣的当事方。因此,我们在 Java 获得许可方之间组织了一系列研讨会,对设计统一的本地方法接口进行了讨论。从研讨会可以明确地看出标准本地方法接口必须满足以下要求:

?二进制兼容性- 主要的目标是在给定平台上的所有Java 虚拟机实现之间实现本地方法库的二进制兼容性。对于给定平台,程序员只需要维护一种版本的本地方法库。

?效率- 若要支持时限代码,本地方法接口必须增加一点系统开销。所有已知的用于确保虚拟机无关性(因而具有二进制兼容性)的技术都会占用一定的系统开销。我

们必须在效率与虚拟机无关性之间进行某种折衷。

?功能- 接口必须显示足够的Java 虚拟机内部情况以使本地方法能够完成有用的任务。

Java 本地接口方法

我们希望采用一种已有的方法作为标准接口,因为这样程序员(程序员不得不学习在不同虚拟机中的多种接口)的工作负担最轻。遗憾的是,已有解决方案中没有任何方案能够完全地满足我们的目标。

Netscape 的 JRI 最接近于我们所设想的可移植本地方法接口,因而我们采用它作为设计起点。熟悉 JRI 的读者将会注意到在 API 命名规则、方法和域 ID 的使用、局部和全局引用的使用,等等中的相似点。虽然我们进行了最大的努力,但是 JNI 并不具有对 JRI 的二进制兼容性,不过虚拟机既可以支持 JRI,又可以支持 JNI。

Microsoft 的 RNI 是对 JDK 1.0 的改进,因为它可以解决使用非保守的垃圾收集器的本地方法的问题。然而,RNI 不适合用作与虚拟机无关的本地方法接口。与 JDK 类似,RNI 本地方法将 Java 对象作为 C 结构来访问。这将导致两个问题:

?RNI 将内部Java 对象的布局暴露给了平台相关代码。

?将Java 对象作为C 结构直接进行访问使得不可能有效地加入“写屏障”,写屏障是高级的垃圾收集算法所必需的。

作为二进制标准,COM 确保了不同虚拟机之间的完全二进制兼容性。调用 COM 方法只要求间接调用,而这几乎不会占用系统开销。另外,COM 对象对动态链接库解决版本问题的方式也有很大的改进。

然而,有几个因素阻碍了将 COM 用作标准 Java 本地方法接口:

?第一,Java/COM 接口缺少某些必需功能,例如访问私有域和抛出普通异常。

?第二,Java/COM 接口自动为Java 对象提供标准的IUnknown 和IDispatch COM 接口,因而平台相关代码能够访问公有方法和域。遗憾的是,IDispatch 接口不能处理重载的Java 方法,而且在匹配方法名称时不区别大小写。另外,通过IDispatch 接口暴露的所有Java 方法被打包在一起来执行动态类型检查和强制转换。这是因

为IDispatch 接口的设计只考虑到了弱类型的语言(例如Basic)。

?第三,COM 允许软件组件(包括完全成熟的应用程序)一起工作,而不是处理单个低层函数。我们认为将所有Java 类或低层本地方法都当作软件组件是不恰当的。

?第四,在UNIX 平台上由于缺少对COM 的支持,所以阻碍了直接采用COM。

虽然我们没有将 Java 对象作为 COM 对象暴露给平台相关代码,但是 JNI 接口自身与 COM 具有二进制兼容性。我们采用与 COM 一样的跳转表和调用约定。这意味着,一旦具有对 COM 的跨平台支持,JNI 就能成为 Java 虚拟机的 COM 接口。

我们认为 JNI 不应该是给定 Java 虚拟机所支持的唯一的本地方法接口。标准接口的好处在于程序员可以将自己的平台相关代码库加载到不同的 Java 虚拟机上。在某些情况下,程序员可能不得不使用低层且与虚拟机有关的接口来获得较高的效率。但在其它情况下,程序员可能使用高层接口来建立软件组件。实际上,我们希望随着 Java 环境和组件软件技术发展得越来越成熟,本地方法将变得越来越不重要。

利用JNI 编程

本地方法程序设计人员应开始利用 JNI 进行编程。利用 JNI 编程隔离了一些未知条件,例如终端用户可能正在运行的厂商的虚拟机。遵守 JNI 标准是本地库能在给定 Java 虚拟机上运行的最好保证。例如,虽然 JDK 1.1 将继续支持 JDK 1.0 中所实现的旧式的本地方法接口,但是可以肯定的是 JDK 的未来版本将停止支持旧式的本地方法接口。依赖于旧式接口的本地方法将不得不重新编写。

如果您正在实现 Java 虚拟机,则应该实现 JNI。我们(Javasoft 和获得许可方)尽力确保 JNI 不会占用虚拟机实现的系统开销或施加任何限制,包括对象表示,垃圾收集机制等。如果您遇到了我们可能忽视了的问题,请告知我们。

JDK 1.1.2 中的变化

为了更好地支持 Java 运行时环境 (JRE),在 JDK 1.1.2 中对调用 API 在几个方面作了扩展。这些变化没有破坏任何已有代码,JNI 本地方法接口也没有改变。

?JDK1_1InitArgs结构中的reserved0域已被重新命名为version。

JDK1_1InitArgs结构保存JNI_CreateJavaVM的初始化参数。

JNI_GetDefaultJavaVMInitArgs和JNI_CreateJavaVM的调用者必须将版

本域设置为0x00010001。JNI_GetDefaultJavaVMInitArgs被更改为返回

jint,用于表示是否支持所请求的版本。

?JDK1_1InitArgs结构中的reserved1域已被重新命名为properties。这是一个NULL-终结的字符串数组。每个字符串具有以下格式:

name=value

表示系统属性(该功能对应于 Java 命令行中的 -D 选项)。

?在JDK 1.1.1 中,调用DestroyJavaVM的线程必须是虚拟机中的唯一用户线程。

JDK 1.1.2 放松了这一限制。如果调用DestroyJavaVM时有多个用户线程,则虚

拟机将等待直到当前线程成为唯一的用户线程,然后销毁自己。

2 - 设计概述

本章着重讨论 JNI 中的主要设计问题,其中的大部分问题都与本地方法有关。调用 API 的设计将在第 5 章“调用API”中讨论。

JNI 接口函数和指针

平台相关代码是通过调用 JNI 函数来访问 Java 虚拟机功能的。JNI 函数可通过接口指针来获得。接口指针是指针的指针,它指向一个指针数组,而指针数组中的每个元素又指向一个接口函数。每个接口函数都处在数组的某个预定偏移量中。图 2-1 说明了接口指针的组织结构。

图2-1 接口指针

JNI 接口的组织类似于 C++ 虚拟函数表或 COM 接口。使用接口表而不使用硬性编入的函数表的好处是使 JNI 名字空间与平台相关代码分开。虚拟机可以很容易地提供多个版本的 JNI 函数表。例如,虚拟机可支持以下两个 JNI 函数表:

?一个表对非法参数进行全面检查,适用于调试程序;

?另一个表只进行JNI 规范所要求的最小程度的检查,因此效率较高。

JNI 接口指针只在当前线程中有效。因此,本地方法不能将接口指针从一个线程传递到另一个线程中。实现 JNI 的虚拟机可将本地线程的数据分配和储存在JNI 接口指针所指向的区域中。

本地方法将 JNI 接口指针当作参数来接受。虚拟机在从相同的 Java 线程中对本地方法进行多次调用时,保证传递给该本地方法的接口指针是相同的。但是,一个本地方法可被不同的 Java 线程所调用,因此可以接受不同的 JNI 接口指针。

加载和链接本地方法

对本地方法的加载通过 System.loadLibrary 方法实现。下例中,类初始化方法加载了一个与平台有关的本地库,在该本地库中给出了本地方法 f 的定义:

package pkg;

class Cls {

native double f(int i, String s);

static {

System.loadLibrary("pkg_Cls");

}

}

System.loadLibrary 的参数是程序员任意选取的库名。系统按照标准的但与平台有关的处理方法将该库名转换为本地库名。例如,Solaris 系统将名称

pkg_Cls 转换为 libpkg_Cls.so,而 Win32 系统将相同的名称 pkg_Cls 转换为pkg_Cls.dll。

程序员可用单个库来存放任意数量的类所需的所有本地方法,只要这些类将被相同的类加载器所加载。虚拟机在其内部为每个类加载器保护其所加载的本地库清单。提供者应该尽量选择能够避免名称冲突的本地库名。

如果底层操作系统不支持动态链接,则必须事先将所有的本地方法链接到虚拟机上。这种情况下,虚拟机实际上不需要加载库即可完成 System.loadLibrary 调用。

程序员还可调用 JNI 函数 RegisterNatives() 来注册与类关联的本地方法。在与静态链接的函数一起使用时,RegisterNatives() 函数将特别有用。

解析本地方法名

动态链接程序是根据项的名称来解析各项的。本地方法名由以下几部分串接而成:

?前缀Java_

?mangled 全限定的类名

?下划线(“_”)分隔符

?mangled 方法名

?对于重载的本地方法,加上两个下划线(“__”),后跟mangled 参数签名

虚拟机将为本地库中的方法查找匹配的方法名。它首先查找短名(没有参数签名的名称),然后再查找带参数签名的长名称。只有当某个本地方法被另一个本地方法重载时程序员才有必要使用长名。但如果本地方法的名称与非本地方法的名称相同,则不会有问题。因为非本地方法(Java 方法)并不放在本地库中。

下例中,不必用长名来链接本地方法 g,因为另一个方法 g 不是本地方法,因而它并不在本地库中。

class Cls1 {

int g(int i);

native int g(double d);

}

我们采取简单的名字搅乱方案,以保证所有的 Unicode 字符都能被转换为有效的 C 函数名。我们用下划线(“_”)字符来代替全限定的类名中的斜杠

(“/”)。由于名称或类型描述符从来不会以数字打头,我们用 _0、...、_9 来代替转义字符序列,如表 2-1 所示:

表2-1 Unicode 字符转

转义字符序列表示

_0XXXX Unicode 字符XXXX。

_1 字符“_”

_2 签名中的字符“;”

_3 签名中的字符“[”

本地方法和接口 API 都要遵守给定平台上的库调用标准约定。例如,UNIX 系统使用 C 调用约定,而 Win32 系统使用 __stdcall。

本地方法的参数

JNI 接口指针是本地方法的第一个参数。其类型是 JNIEnv。第二个参数随本地方法是静态还是非静态而有所不同。非静态本地方法的第二个参数是对对象的引用,而静态本地方法的第二个参数是对其 Java 类的引用。

其余的参数对应于通常 Java 方法的参数。本地方法调用利用返回值将结果传回调用程序中。第 3 章“JNI 的类型和数据结构”将描述 Java 类型和 C 类型之间的映射。

代码示例 2-1 说明了如何用 C 函数来实现本地方法 f。对本地方法 f 的声明如下:

package pkg;

class Cls {

native double f(int i, String s);

...

}

具有长 mangled 名称 Java_pkg_Cls_f_ILjava_lang_String_2 的 C 函数实现本地方法f:

代码示例2-1:用 C 实现本地方法

jdouble Java_pkg_Cls_f__ILjava_lang_String_2 (

JNIEnv *env, /* 接口指针 */

jobject obj, /* “this”指针 */

jint i, /* 第一个参数 */

jstring s) /* 第二个参数 */

{

/* 取得 Java 字符串的 C 版本 */

const char *str = (*env)->GetStringUTFChars(env, s, 0);

/* 处理该字符串 */

...

/* 至此完成对 str 的处理 */

(*env)->ReleaseStringUTFChars(env, s, str);

return ...

}

注意,我们总是用接口指针 env 来操作 Java 对象。可用 C++ 将此代码写得稍微简洁一些,如代码示例 2-2 所示:

代码示例2-2:用C++ 实现本地方法

extern "C" /* 指定 C 调用约定 */

jdouble Java_pkg_Cls_f__ILjava_lang_String_2 (

JNIEnv *env, /* 接口指针 */

jobject obj, /* “this”指针 */

jint i, /* 第一个参数 */

jstring s) /* 第二个参数 */

{

const char *str = env->GetStringUTFChars(s, 0);

...

env->ReleaseStringUTFChars(s, str);

return ...

}

使用 C++ 后,源代码变得更为直接,且接口指针参数消失。但是,C++ 的内在机制与 C 的完全一样。在 C++ 中,JNI 函数被定义为内联成员函数,它们将扩展为相应的 C 对应函数。

引用Java 对象

基本类型(如整型、字符型等)在 Java 和平台相关代码之间直接进行复制。而Java 对象由引用来传递。虚拟机必须跟踪传到平台相关代码中的对象,以使这些对象不会被垃圾收集器释放。反之,平台相关代码必须能用某种方式通知虚拟机它不再需要那些对象,同时,垃圾收集器必须能够移走被平台相关代码引用过的对象。

全局和局部引用

JNI 将平台相关代码使用的对象引用分成两类:局部引用和全局引用。局部引用在本地方法调用期间有效,并在本地方法返回后被自动释放掉。全局引用将一直有效,直到被显式释放。

对象是被作为局部引用传递给本地方法的,由 JNI 函数返回的所有 Java 对象也都是局部引用。JNI 允许程序员从局部引用创建全局引用。要求 Java 对象的JNI 函数既可接受全局引用也可接受局部引用。本地方法将局部引用或全局引用作为结果返回。

大多数情况下,程序员应该依靠虚拟机在本地方法返回后释放所有局部引用。但是,有时程序员必须显式释放某个局部引用。例如,考虑以下的情形:

?本地方法要访问一个大型Java 对象,于是创建了对该Java 对象的局部引用。然后,本地方法要在返回调用程序之前执行其它计算。对这个大型Java 对象的局部引用

将防止该对象被当作垃圾收集,即使在剩余的运算中并不再需要该对象。

?本地方法创建了大量的局部引用,但这些局部引用并不是要同时使用。由于虚拟机需要一定的空间来跟踪每个局部引用,创建太多的局部引用将可能使系统耗尽内存。

例如,本地方法要在一个大型对象数组中循环,把取回的元素作为局部引用,并在

每次迭代时对一个元素进行操作。每次迭代后,程序员不再需要对该数组元素的局

部引用。

JNI 允许程序员在本地方法内的任何地方对局部引用进行手工删除。为确保程序员可以手工释放局部引用,JNI 函数将不能创建额外的局部引用,除非是这些JNI 函数要作为结果返回的引用。

局部引用仅在创建它们的线程中有效。本地方法不能将局部引用从一个线程传递到另一个线程中。

实现局部引用

为了实现局部引用,Java 虚拟机为每个从 Java 到本地方法的控制转换都创建了注册服务程序。注册服务程序将不可移动的局部引用映射为 Java 对象,并防止这些对象被当作垃圾收集。所有传给本地方法的 Java 对象(包括那些作为JNI 函数调用结果返回的对象)将被自动添加到注册服务程序中。本地方法返回后,注册服务程序将被删除,其中的所有项都可以被当作垃圾来收集。

可用各种不同的方法来实现注册服务程序,例如,使用表、链接列表或 hash 表来实现。虽然引用计数可用来避免注册服务程序中有重复的项,但 JNI 实现不是必须检测和消除重复的项。

注意,以保守方式扫描本地堆栈并不能如实地实现局部引用。平台相关代码可将局部引用储存在全局或堆数据结构中。

访问Java 对象

JNI 提供了一大批用来访问全局引用和局部引用的函数。这意味着无论虚拟机在内部如何表示 Java 对象,相同的本地方法实现都能工作。这就是为什么 JNI 可被各种各样的虚拟机实现所支持的关键原因。

通过不透明的引用来使用访问函数的开销比直接访问 C 数据结构的开销来得高。我们相信,大多数情况下,Java 程序员使用本地方法是为了完成一些重要任务,此时这种接口的开销不是首要问题。

访问基本类型数组

对于含有大量基本数据类型(如整数数组和字符串)的 Java 对象来说,这种开销将高得不可接受(考虑一下用于执行矢量和矩阵运算的本地方法的情形便知)。对 Java 数组进行迭代并且要通过函数调用取回数组的每个元素,其效率是非常低的。

一个解决办法是引入“钉住”概念,以使本地方法能够要求虚拟机钉住数组内容。而后,该本地方法将接受指向数值元素的直接指针。但是,这种方法包含以下两个前提:

垃圾收集器必须支持钉住。

?虚拟机必须在内存中连续存放基本类型数组。虽然大多数基本类型数组都是连续存放的,但布尔数组可以压缩或不压缩存储。因此,依赖于布尔数组确切存储方式的

本地方法将是不可移植的。

我们将采取折衷方法来克服上述两个问题。

首先,我们提供了一套函数,用于在 Java 数组的一部分和本地内存缓冲之间复制基本类型数组元素。这些函数只有在本地方法只需访问大型数组中的一小部分元素时才使用。

其次,程序员可用另一套函数来取回数组元素的受约束版本。记住,这些函数可能要求 Java 虚拟机分配存储空间和进行复制。虚拟机实现将决定这些函数是否真正复制该数组,如下所示:

?如果垃圾收集器支持钉住,且数组的布局符合本地方法的要求,则不需要进行复制。

?否则,该数组将被复制到不可移动的内存块中(例如,复制到C 堆中),并进行必要的格式转换,然后返回指向该副本的指针。

最后,接口提供了一些函数,用以通知虚拟机本地方法已不再需要访问这些数组元素。当调用这些函数时,系统或者释放数组,或者在原始数组与其不可移动副本之间进行协调并将副本释放。

这种处理方法具有灵活性。垃圾收集器的算法可对每个给定的数组分别作出复制或钉住的决定。例如,垃圾收集器可能复制小型对象而钉住大型对象。

JNI 实现必须确保多个线程中运行的本地方法可同时访问同一数组。例如,JNI 可以为每个被钉住的数组保留一个内部计数器,以便某个线程不会解开同时被另一个线程钉住的数组。注意,JNI 不必将基本类型数组锁住以专供某个本地方法访问。同时从不同的线程对 Java 数组进行更新将导致不确定的结果。

访问域和方法

JNI 允许本地方法访问 Java 对象的域或调用其方法。JNI 用符号名称和类型签名来识别方法和域。从名称和签名来定位域或对象的过程可分为两步。例如,为调用类 cls 中的 f 方法,平台相关代码首先要获得方法 ID,如下所示:

jmethodID mid =

env->GetMethodID(cls, "f", "(ILjava/lang/String;)D");

然后,平台相关代码可重复使用该方法 ID 而无须再查找该方法,如下所示: jdouble result = env->CallDoubleMethod(obj, mid, 10, str);

域 ID 或方法 ID 并不能防止虚拟机卸载生成该 ID 的类。该类被卸载之后,该方法 ID 或域 ID 亦变成无效。因此,如果平台相关代码要长时间使用某个方法ID 或域 ID,则它必须确保:

?保留对所涉及类的活引用,或

?重新计算该方法ID 或域ID。

JNI 对域 ID 和方法 ID 的内部实现并不施加任何限制。

报告编程错误

JNI 不检查诸如传递 NULL 指针或非法参数类型之类的编程错误。非法的参数类型包括诸如要用 Java 类对象时却用了普通 Java 对象这样的错误。JNI 不检查这些编程错误的理由如下:

?强迫JNI 函数去检查所有可能的错误情况将降低正常(正确)的本地方法的性能。

?在许多情况下,没有足够的运行时的类型信息可供这种检查使用。

大多数 C 库函数对编程错误不进行防范。例如,printf() 函数在接到一个无效地址时通常是引起运行错而不是返回错误代码。强迫 C 库函数检查所有可能的错误情况将有可能引起这种检查被重复进行--先是在用户代码中进行,然后又在库函数中再次进行。

程序员不得将非法指针或错误类型的参数传递给 JNI 函数。否则,可能产生意想不到的后果,包括可能使系统状态受损或使虚拟机崩溃。

Java 异常

JNI 允许本地方法抛出任何 Java 异常。本地方法也可以处理突出的 Java 异常。未被处理的 Java 异常将被传回虚拟机中。

异常和错误代码

一些 JNI 函数使用 Java 异常机制来报告错误情况。大多数情况下,JNI 函数通过返回错误代码并抛出 Java 异常来报告错误情况。错误代码通常是特殊的返

回值(如 NULL),这种特殊的返回值在正常返回值范围之外。因此,程序员可以:

?快速检查上一个JNI 调用所返回的值以确定是否出错,并

?通过调用函数ExceptionOccurred() 来获得异常对象,它含有对错误情况的更详细说明。

在以下两种情况中,程序员需要先查出异常,然后才能检查错误代码:

?调用Java 方法的JNI 函数返回该Java 方法的结果。程序员必须调用ExceptionOccurred() 以检查在执行Java 方法期间可能发生的异常。

?某些用于访问JNI 数组的函数并不返回错误代码,但可能会抛出

ArrayIndexOutOfBoundsException 或ArrayStoreException。

在所有其它情况下,返回值如果不是错误代码值就可确保没有抛出异常。

异步异常

在多个线程的情况下,当前线程以外的其它线程可能会抛出异步异常。异步异常并不立即影响当前线程中平台相关代码的执行,直到出现下列情况:

?该平台相关代码调用某个有可能抛出同步异常的JNI 函数,或者

?该平台相关代码用ExceptionOccurred() 显式检查同步异常或异步异常。

注意,只有那些有可能抛出同步异常的 JNI 函数才检查异步异常。

本地方法应在必要的地方(例如,在一个没有其它异常检查的紧密循环中)插入ExceptionOccurred() 检查以确保当前线程可在适当时间内对异步异常作出响应。

异常的处理

可用两种方法来处理平台相关代码中的异常:

?本地方法可选择立即返回,使异常在启动该本地方法调用的Java 代码中抛出。

?平台相关代码可通过调用ExceptionClear() 来清除异常,然后执行自己的异常处理代码。

抛出了某个异常之后,平台相关代码必须先清除异常,然后才能进行其它的 JNI 调用。当有待定异常时,只有以下这些 JNI 函数可被安全地调用:

ExceptionOccurred()、ExceptionDescribe() 和 ExceptionClear()。ExceptionDescribe() 函数将打印有关待定异常的调试消息。

3 - JNI 的类型和数据结构

本章讨论 JNI 如何将 Java 类型映射到本地 C 类型。

基本类型

表 3-1 描述 Java 基本类型及其与计算机相关的本地等效类型。

表3-1 基本类型和本地等效类

Java 类型本地类型说明boolean jboolean 无符号,8 位

byte jbyte 无符号,8 位

char jchar 无符号,16 位

short jshort 有符号,16 位

int jint 有符号,32 位

long jlong 有符号,64 位

float jfloat 32 位

double jdouble 64 位

void void N/A

为了使用方便,特提供以下定义。

#define JNI_FALSE 0

#define JNI_TRUE 1

jsize 整数类型用于描述主要指数和大小:

typedef jint jsize;

引用类型

JNI 包含了很多对应于不同 Java 对象的引用类型。JNI 引用类型的组织层次如图 3-1 所示。

图3-1 引用类型层次

在 C 中,所有其它 JNI 引用类型都被定义为与 jobject 一样。例如:

typedef jobject jclass;

在 C++ 中,JNI 引入了虚构类以加强子类关系。例如:

class _jobject {};

class _jclass : public _jobject {};

...

typedef _jobject *jobject;

typedef _jclass *jclass;

域ID 和方法ID

方法 ID 和域 ID 是常规的 C 指针类型:

Java开发规范

Java开发规范

目录 第1章序言 (4) 第2章java一般性研发规范 (5) 2.1 代码格式 (5) 2.1.1包、类、方法的命名规范: (5) 2.1.2方法的命名应注意避免与java中具有特殊意义的名称例如equals, hashCode,clone,finalizer等冲突 (7) 2.1.3Java bean中取得boolean类型的属性值必须使用is****形式命名 (9) 2.1.4if,else,while,for等必须使用{} (9) 2.1.5类必须包含在包里,禁止出现无包的类 (10) 2.1.6类和方法必须拥有注释,注释量占总体代码25%以上,类头部,以及方法 头部的注释应符合javadoc标准。 (11) 2.2 基本语法 (12) 2.2.1不能随意捕捉异常,原则上谁捕捉谁处理 (12) 2.2.2if,while,try,finally,switch ,synchronized ,static instantiation 里面应有相应的逻辑处理,不能为空。 (13) 2.2.3在处理循环中,不能在程序中人为的改变步长。 (14) 2.2.4将简单类型int,short,float,double等转化成字符串时,需使用其对 应类的toString方法。 (14) 2.2.5javaBean中hashCode,以及equals方法必须同时override。 (15) 2.2.6懒式方式创建对象:不能采用双检查惯用法 (18) 2.2.7不能在finally中返回值。 (19) 2.2.8Boolean实例化时,应用使用Boolean.valueOf,Boolean.TRUE, Boolean.FALSE。 (19) 2.2.9Integer,Byte,Short,Long等实例化时,应用使用valueOf (20) 2.2.10对于多个if语句嵌套的情况下能够整合尽量整合。 (20) 2.2.11override function,不能只有super.function语句,否则视为无效代码 21 2.2.12Collection.toArray的注意事项。 (21) 2.2.13对于BigDecimal方法,应避免使用float值,double值进行创建,应使 用字符串形式创建。 (22) 2.2.14String,BigDecimal,BigInteger等值类型调用replace,add等方法的注 意事项。 (23) 2.2.15需要注意的引起NullException的语句。 (23) 2.2.16ResultSet使用next时,需要判断是否具有记录再进行一下步操作。 25 2.2.17字符串使用相应的规则。 (25) 2.2.18禁止直接调用 System.gc(),System.getRuntime().gc(),System.runFinalization()。 (27) 2.2.19finalize相应的规则。 (27) 2.2.20禁止在代码中使用System.out,ex.printStackTrace打印日志。 (28) 2.2.21系统资源释放(谁创建的,谁关闭) (29) 2.2.22使用Clone时相应的规则。 (32) 2.2.23java Bean类必须实现Serialize接口。 (33)

基于JAVA的仓库管理系统

常州工学院 计算机信息工程学院《Java》课程设计报告 题目:仓库管理系统 年级: 10计一 专业:计算机科学与技术组长:薛建(10030126)组员:杨君(10030127) 赵波(10030131)指导教师:朱迎庆 2012年7 月 5 日

JAVA不仅是一门最为流行的计算机语言,而且已经形成一种专门的技术,带来了20世纪末和本世纪初网络科技和网络经济超常发展。JAVA的与平台无关性、高可靠性、安全机制和内嵌网络支持等特性使它成为编写网络应用程序的首选工具之一。 从另一方面来看,软件开发的规模也日渐扩大,对软件质量的要求越来越高,与之相对应的是,各种软件技术和工具层出不穷,各种软件开发、软件质量控制、软件管理法方法学业日渐成熟。面对软件发展的这一现状和趋势,无论是拥有计算机基础知识的学生还是IT领域的起步者,熟练掌握一门语言都是至关重要的。JAVA是一个面向对象的程序设计软件,它将重点放在数据和对象的接口上,与C++相比的主要不同在于多继承,在JAVA中,取而代之的是简单的接口,以及JAVA的元类模型。这也很大程度上给我们初学编程的人带来很呆的方便,也使我们更容易掌握JAVA编程的一些基本要领和深层知识。 该程序是利用文件来实现的,程序的重要作用是对员工信息进行管理,包括员工信息的添加、查询、修改、删除。通过该课程设计,使同学们进一步理解概JAVA的基本概念、理论和方法,初步掌握JDK、Eclipse的调试和应用,以及程序中错误的解决方法,明确JAVA在实际程序设计中的应用。使课堂中学习到理论得到应用,练习文件形式在JAVA程序设计中的应用。 关键词:面向对象、软件开发、继承、员工管理

Java编程规范试题

姓名: ____________ 工号:_______________ 部门:____________ 成绩: 一. 判断题(共15题,每题2分,直接在括号内打“/或“X”) 1、任何时候都不要使接口可以序列化。x 2、相对独立的程序块之间、变量说明之后必须加空行。V 3、当程序需要释放对象的时候,应该手工调用fin alize 方法以释放对象。x 4、公司的规范要求注释率是20%以上,并且必须有助于对程序的阅读理解。x 5、为了程序更加简洁,我们应该尽量使用下面的方式来赋值: a = b = 1 。x 6、每个类都需要定义构建器。x 7、类名、方法名、属性名的命名,都应该使用意义完整的英文描述。V 8、main() 方法的定义是public static void main(String args[]) 。x 9、常量名应该使用全大写,英文单词之间用下划线或者-分隔开。并且,常量应该使用final static 修饰。x 10、公有方法参数名可以和属性名相同,但局部变量不能和属性名相同。V 11、一两行代码就能完成的功能没有必要编写方法实现。x 12、对于模块间接口方法的参数的合法性检查,调用者和被调用者都应该对参数进行合法性检查。 x 13、运行期异常使用RuntimeException的子类来表示,必须在方法声明上加throws子句。x非运行 期异常是从Exception继承而来的,不用在可能抛出异常的方法声明上加throws子句。x 14、使用Objectstream 的方法后,调用release(),释放对象。X 15、减小单个方法的复杂度,使用的if, while, for, switch 语句要在10个以内。V 二、单项选择题(共23题,每题2分) (c ) 1、排版时,代码缩进应该采用的方式是: (A)Tab缩进 (B)2个空格缩进

基于Java的仓库管理系统设计开题报告

长江大学 毕业设计开题报告 题目名称基于Java的仓库管理系统设计题目类别毕业设计 院(系)计算机科学学院 专业班级网络10701 学生姓名王震 指导教师沈疆海 辅导教师沈疆海 开题报告日期2011/03/06 基于Java的仓库管理系统设计

学生:王震计算机科学学院 老师:沈疆海计算机科学学院 一、题目来源 仓库库存管理是一个企业不可缺少的部分,它的内容对于企业的决策者和管理者来说都至关重要,所以仓库库存管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理仓库中的各种物资设备,这种管理方式存在着许多缺点,如:效率低、另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。 使用计算机对物资信息进行管理有着手工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高仓库管理的效率,也是企业的科学化、正规化管理的重要条件。 二、研究目的和意义 这是一个互联网的时代,所有企业都面临着互联网浪潮的强力冲击,电子商务无论从技术实现还是社会大背景都日益成熟。企业对企业之间的信息化如何解决?企业电子商务如何实现?这些都是摆在企业企业管理者和信息部门负责人面前实实在在的问题。借助于信息技术手段的创新,规范业务流程,强化仓库管理,对于企业信息化来说是一次良好契机。 在计算机的应用日益普及的今天,在计算机软件渐渐成为生活一部分的时代,在现代企业仓库物流需要电子化管理的现在,一个基于web的智能仓库管理系统呼之欲出。这个系统,既可以减轻仓库管理员的工作负担,理需求,提高了企业内部的管理水平,进而全面提升了企业在市场竞争中的综合竞争力。 三、课题简介: 本系统主要完成对仓库的库存管理,包括入库、出库、库存,员工信息,供应商信息以及密码管理等六个方面。系统可以完成对各类信息的浏览、查询、添加、删除、修改、报表等功能。

JAVA开发规范文档

Java 开发规范文档 一:目的 使本组织能以标准的,规范的方式设计和编码。通过建立编码规范,以使每个开发人员养成良好的编码风格和习惯;并以此形成开发小组编码约定,提高程序的可靠性,可读性,可修改性,可维护性和一致性等,增进团队间的交流,并保证软件产品的质量。 二:代码组织与风格 1:长度:为便于阅读和理解,单个函数的有效代码长度当尽量在100行以内(不包括注释行),当功能模块过大时往往采用使用子函数将相应的功能抽取出来,这也有利于提高代码的重用度。 2:单个类不宜过大,当出现此类过大时当将相应功能的代码重构到其他类中,通过组合等方式来调用,建议单个类的长度包括注释行不超过1500行。尽量避免使用大类和长方法。3:间隔:类,方法及功能块间等应以空行相隔,以增加可读性,但不得有无规则的大片空行。操作符两端应当各空一个字符以增加可读性。 三:注释 1:注释应该增加代码的清晰度。代码注释的目的时要使代码更易于被其他开发人员等理解。2:保持注释的简洁。 3:注释信息应该包括代码的功能。 4:除变量定义等较短语句的注释使用行尾注释外,其他注释当避免使用行尾注释。 5:JavaDoc规范 对类,方法,变量等注释需要符合javadoc规范,对每个类,方法都应详细说明其功能条件,参数等。类注释中应当包含版本和作者信息。 1)类,接口注释在类,接口定义之前当对其进行注释,包括类,接口的目的,作用,功能,继承于何种父类,实现的接口,实现的算法,使用方法,示例程序等。 2)方法注释以明确该方法功能,作者,各参数含义以及返回值等。

3)其他注释应对重要的变量及不易理解的分支条件表达式加以注释,以说明其含义等。四命名规范 1:对变量,类,接口及包的命名应该使用英文。严禁使用汉语拼音及不相关单词命名。更不可以使用汉字来进行命名。采用大小写混合,提高名字的可读性。一般应该采用小写字母,但时类和接口的名称的首字母,以及任何中间单词的首字母应该大写。包名全部小写。 2:尽量少用缩写,但如果一定要用,当使用公共缩写和习惯缩写等,如implement可缩写为impl,manager可缩写成mgr等。 3:包名一般以项目或模块名命名,少用缩写和长名,一律小写。 包名按照如下规定组成[基本包].[项目名].[模块名].[子模块名].…. 如:org.skyinn.skyhome.dao.hibernate。 不得将类直接定义在基本包下,所有项目中的类,接口等都当定义在各自的项目和模块包中。 4:类,接口所有单词首字母大写,最好能够见名知意。一般采用名词。接口可带I前缀。 或able,dao后缀。 5:字段常量采用完整的英文大写单词,单词之间用下划线连接,如DEFAULT_V ALUE. 6:变量和参数对不易识别出该变量类型的变量应使用类型缩写作其前缀,如字符串使用strXXX,boolean使用isXXX,hasXXX等等。除第一个单词外其余单词的首字母大写。7:集合采用复数名称来表示队列中存放的对象类型,名词采用完整的英文描述。 例如:Vector vProducts= new Vector(); Array aryUsers= new Array(); 8:方法方法的名称应采用完整的英文描述,大小写混合使用:所有中间单词的第一个字母大写。方法名称的第一个单词常常采用一个强烈动作色彩的动词。取值类使用get前缀,设置类使用set前缀。例如getName(),setSarry()。 9:异常类名由表示该异常类型的单词和Exception组成,如ActionException。异常实例一般使用e,ex等。 10:数组的命名 数组应该总是用下面的方式来命名:byte[] buffer; 而不是:byte buffer[]; 五:类与接口 1:基本原则:一个类只做一件事情。另一个原则时根据每个类的职责进行划分,比如用User 来存放用户信息,而用UserDAO来对用户信息进行数据访问操作,用UserServer对用户信息的业务操作等等。多个类中使用相同方法时将其方法提到一个接口中或使用抽象类,尽量提高重用度。不希望被实例化的类的缺省构造方法声明为private。 2:一般而言,接口定义行为,而抽象类定义属性和共有行为,注意2者的取舍,在设计中可由接口定义公用的行为,由一个抽象类来实现其部分或全部方法,以给子类提供统一的行为为定义。 六:方法 一个方法只完成一项功能。方法参数类型和参数返回值尽量接口化,以屏蔽具体的实现细节,提高系统的可扩展性,例如:public void addUser(List userList){} public List listAllUsers(){} 七:Web 命名规范 一:jsp页面命名 对于某个功能块的增删改查页面定义,最好使用

JAVA开发规范

1.编程规范 (一)命名规范 1.【强制】所有编程相关的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束 反例:_name / name_ / $name / name$ 正例:name 2.【强制】所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用。 反例:XingMing [姓名] /xingBie() [性别] 正例:name[姓名] sex[性别]等国际通用的名称,可视为英文。 3. 【强制】类名使用UpperCamelCase(第一个词的首字母,以及后面每个词的首字母都大写,叫做“大骆驼拼写法”) 风格,必须遵从驼峰形式,但以下情形例外:(领域模型的相关命名)DO / DTO / VO / DAO 等。正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion 反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion

4. 【强制】方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase (第一个词的首字母小写,后面每个词的首字母大写,叫做“小骆驼拼写法”)风格,必须遵从驼峰形式。 正例: localValue / getHttpMessage() / inputUserId 5. 【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。 正例: MAX_STOCK_COUNT 反例: MAX_COUNT 6. 【强制】抽象类命名使用 Abstract或Base 开头;异常类命名使用 Exception结尾;测试类命名以它要测试的类的名称开始,以 Test 结尾。 7. 【强制】中括号是数组类型的一部分,数组定义如下:String[] args; 请勿使用String args[]的方式来定义 8. 【强制】POJO类中的任何布尔类型的变量,都不要加 is,否则部分框架解析会引起序列化错误。 反例:定义为基本数据类型 boolean isSuccess;的属性,它的方法也是isSuccess(),RPC框架在反向解析的时候,“以为”对应的属性名称是 success,导致属性获取不到,进而抛出异常。

Java仓库管理系统报告

2016—2017学年第一学期期末考试 《面向对象程序设计(Java)*》实践考核项目设计说明书 项目名称:仓库管理系统 专业:计算机科学与技术 学号: 姓名: 任课教师:巩晨静 2016年12月3日

项目及要求 (一)考核内容:Java应用程序开发 (二)考核要求: 1.设计开发一个Java应用程序,设计题目自拟; 2.要求学生熟练运用Java程序设计的基本知识和技能; 3.要求学生掌握面向对象程序开发的基本思路和方法,熟悉软件开发过程;4.要求学生利用面向对象的编程思想以及组件开发原理来完成系统的设计;5.要求学生利用所学的基本知识和技能,进行应用程序设计,并体现自己的创新; 6.要求学生独立完成,严禁拷贝与抄袭; 7.按照软件工程的思想,完成项目的需求分析、项目的功能框架、用户界面的设计、各功能模块的调试和运行等工作; 8.重视设计说明书文档的书写。 9.上交要求。要求学生上交设计说明书一份(Word格式)电子及打印文档(A4纸)各一份,源程序打包上传BB平台。

目录

仓库管理系统设计说明书 第一章项目选题说明 管理信息系统(MIS)的应用已深入到社会的各行各业,它是信息、软件与科学管理相结合的产物。MIS的开发过程不仅是一个编写应用程序的过程,而且是一个以软件工程的思想为指导,从可行性研究开始,经过系统分析、系统设计、系统实施到等主要阶段的规范开发过程。 我们实现的是网络数据库管理系统,我们选择的是仓库管理系统,仓库作为一种资源的集散地,在企业的整个供应链中起着至关重要的作用,如果不能保证正确的库存控制及发货,将会导致管理费用的增加,服务质量难以得到保证,从而影响企业的竞争力,传统简单的,静态管理已经无法保证企业各种资源的搞笑利用。如今的仓库作业和库存控制作业已经十分复杂多样化,仅靠人工记忆和手工录入,不但费时费力,而且容易出错,给企业带来巨大的损失。所以要实施先进的自动化系统,实现企业内部的信息管理,共享交流,才能让企业在竞争激烈的21世纪取得先机。仓库管理系统就是对货物和信息及金钱进行规划和实行交流控制。它将入库、出库、库存形成一个统一的中体,使企业处于全面受控状态,压缩投资规模,加快资金周转。在实时反映的基础上,修正企业在日常生产经营过程中各个环节上的偏差,降低产品成本和货物的积压。 仓库管理系统是通过入库业务、出库业务、实时库存管理等功能综合运用的管理系统,对货物全程进行有效的控制和跟踪,实现完善的企业仓库信息管理。仓库管理系统的投入,将使仓库的管理更加正规化,为产品的出入库管理部门和销售部门提供了方便,降低了仓库的损耗。企业可以通过该系统对售出的产品进行跟踪服务,同时避免可过去销售人员按以往惯例亲自前往用户处去核实货物情况的麻烦,提高了办事小效率,节省了费用,而且还避免了不必要的业务纠纷,维护了企业长期与用户建立的良好信誉。

java项目团队开发规范

项目团队开发规范

修订历史记录

目录 1引言 (6) 1.1 编写目的 (6) 1.2 预期读者 (6) 1.3 编写背景 (6) 2概述 (7) 2.1 目标 (7) 2.2 修改及完善 (7) 3详细规范 (7) 3.1 使用的工具 (7) 3.2 框架设计 (7) 3.3 包目录 (8) 3.4 编码规范 (10) 3.4.1 目的 (10) 3.4.2 依据 (10) 3.4.3 具体规范 (10) 3.4.3.1 编码风格 (10) 3.4.3.1.1 缩进 (10) 3.4.3.1.2 空格 (11) 3.4.3.1.3 对齐 (12) 3.4.3.1.4 空行 (12)

3.4.3.1.5 代码长度 (13) 3.4.3.1.6 行数 (13) 3.4.3.1.7 注释 (14) 3.4.3.2 代码效率 (17) 3.4.3.2.1 综述 (17) 3.4.3.2.2 具体实现 (17) 3.4.3.3 异常处理 (17) 3.4.3.3.1 处理CHECK 异常与UNCHECK异常 (17) 3.4.3.4 程序调试 (17) 3.4.4 日常交流 (18) 3.4.4.1 互相促进 (18)

1引言 1.1 编写目的 本文档作为项目团队开发规范的说明书,描述了项目开发过程中的使用的工具,框架,代码编写规范及注意问题,作为项目团队建设,开发及测试工作的依据。 1.2 预期读者 本文档的预期读者包括以下几类: ?项目组长 ?项目组全体成员 1.3 编写背景 根据公司现有的开发状况,决定组件稳定的项目开发团队,制定全体团队成员共识的开发规范,有助于提高项目开发的效率、项目团队整体水平的提升。

基于JAVA的仓库管理系统

毕业设计论文 基于JA V A的仓库管理系统 Based on JA V A warehouse management system

摘要 随着电子商务技术和网络技术的快速发展,现代物流技术也在不断进步。物流技术是指与物流要素活动有关的所有专业技术的总称,包括各种操作方法、管理技能等,如流通加工技术、物品包装技术、物品标识技术、物品实时跟踪技术,物流存储技术等;物流技术还包括物流规划、物流评价、物流设计、物流策略等;当计算机网络技术的应用普及后,物流技术中综合了许多现代技术如GIS(地理信息系统)、GPS(全球卫星定位)、EDI(电子数据交换)、BAR CODE(条码)等。物流业在采用某些现代信息技术方面的成功经验和规范集成,为电子商务的推广普及铺平了道路。例如世界零售业巨头美国沃尔玛早已采用GPS进行物流跟踪和监控来保证商品及时、可靠、安全的到达各个销售地点。 虽然GPS在商业方面的应用在我国目前来说还不太现实,成本也比较高。但是互联网在我国的普及和发展已经非常成熟和稳固,我们利用现有的网络技术也可以实现对物流的商品的跟踪监控! 采用java三层构架技术开发的仓库管理系统实现了对商品库存信息,供应商信息,商品信息,入库商品信息,出库商品信息的便捷管理。实现了仓储管理的信息化,减少了人力,节省了财力,提高了企业运作的效率有效控制商品库存量为企业节省了不必要的浪费。 关键词物流技术,物流业,U/T网络物流系统

Abstract Abstract As the e-business and network technology to the rapid development,the modern logistics technology has been stead ily progressing. Logistics is the logistics’s elements and related to the activities of all professional and technical customers, including various methods of operation, Management skills, such as flow-processing technology, packaging technology goods, goods identification technology, real-time tracking technology items, Logistics Storage Technology; Logistics Technology also include logistics planning, logistics evaluation, logistics design, logistics strategies; When Computer Network Technology Application widespread, integrated logistics technology many modern technologies such as GIS (geographic information systems), GPS (global positioning satellite), EDI (electronic data interchange), BAR CODE (bar code). In the logistics industry to adopt certain aspects of modern information technology and the successful experience of normative integration, for the promotion of e-commerce has paved the way. World retail giants such as Wal-Mart has used American GPS tracking and logistics to ensure the monitoring of goods in a timely manner, reliable, safe arrival of all sales. Although GPS in commercial applications in China at present is not really reality, the cost is relatively high. But the Internet in China and the spread of development has been very mature and solid, We utilize the existing network technology can achieve the value of logistics tracking control! Three-tier architecture using java technology development Warehouse Management System for goods inventory information, Information providers, the volume of information storage and commodity information, commodity information from the convenience of management. Implementation of storage management information, and reduce the manpower, financial savings, improve the efficiency of the operation of enterprises effectively controlled commodity stocks for saving the unnecessary wastage. Key Words Logistics Technology, Logistics, U/T Network logistics system

Java编程要求规范精彩试题

JAVA编程规范--试题 姓名:工号:部门:成绩: 一. 判断题(共15题,每题2分,直接在括号内打“√”或“×”) 1、任何时候都不要使接口可以序列化。x 2、相对独立的程序块之间、变量说明之后必须加空行。√ 3、当程序需要释放对象的时候,应该手工调用finalize方法以释放对象。x 4、公司的规范要求注释率是20%以上,并且必须有助于对程序的阅读理解。x 5、为了程序更加简洁,我们应该尽量使用下面的方式来赋值:a = b = 1 。x 6、每个类都需要定义构建器。x 7、类名、方法名、属性名的命名,都应该使用意义完整的英文描述。√ 8、main() 方法的定义是public static void main(String args[])。x 9、常量名应该使用全大写,英文单词之间用下划线或者-分隔开。并且,常量应该使用 final static修饰。x 10、公有方法参数名可以和属性名相同,但局部变量不能和属性名相同。√ 11、一两行代码就能完成的功能没有必要编写方法实现。x 12、对于模块间接口方法的参数的合法性检查,调用者和被调用者都应该对参数进行合 法性检查。x 13、运行期异常使用RuntimeException的子类来表示,必须在方法声明上加throws子句。 x非运行期异常是从Exception继承而来的,不用在可能抛出异常的方法声明上加throws 子句。x 14、使用ObjectStream 的方法后,调用release() ,释放对象。X 15、减小单个方法的复杂度,使用的 if, while, for, switch 语句要在10个以内。√ 二、单项选择题(共23题,每题2分) ( c )1、排版时,代码缩进应该采用的方式是: (A)Tab缩进 (B)2个空格缩进 (C)4个空格缩进 (D)8个空格缩进

毕业设计+仓库管理系统+JAVA源代码++设计说明

计算机与通信学院本科生毕业设计说明书仓库管理系统 作者: 学号: 专业:计算机科学与技术 班级: 指导教师: 答辩时间:

仓库管理系统Storage Management System

前言 随着科学技术的不断发展,我们的社会已经进入了一个信息化的社会,人们每天都要接收大量的信息和处理大量的数据,仅靠传统的纸和笔已不能适应这个时代的要求,人们必须采取新的手段,于是信息技术进入我们的生活,计算机不再是简单的计算工具,它已成为我们生活中处理大量信息的不可或缺的手段。在当今产业竞争越来越激烈的信息时代,企业经营除了降低成本,提高品质外,更需要以先进的管理理念来整合企业内部与外部资源。仓库管理系统正是在这个背景下产生的。 本系统正是针对仓库部门的货物信息管理,通过对仓库基本信息﹑出入库信息等的系统界面设计,将会给管理者带来极大的方便,具有手工管理无法比拟的优点,例如检索速度快、查找方便、可靠性高、存储量大、使用时间长等。用计算机管理取代传统的手工操作,大大减少了管理人员的工作量,提高了工作效率,为获取详细的管理信息提供了保证,方便各类人员的查询和信息保证,增强了管理工作的时效和人员主动性。 仓库管理主要摆阔两方面:一是仓库的基本信息,涉及人员信息、库房信息、供货商信息、客户信息;另一项是仓库业务管理,包括入库管理、在库管理、出库管理、报表管理。在本系统中侧重实现仓库的基本信息管理。

摘要 仓库管理系统是为了实现企业产品管理的系统化、规范化和自动化,从而提高企业管理效率而设计的。它完全取代了原来一直用人工管理的工作方式,避免了由于管理人员的工作疏忽以及管理质量问题所造成的各种错误,为及时、准确、高效的完成仓库管理提供了强有力的工具和管理手段。仓库管理系统是一个中小型数据库管理系统,它界面美观、操作简单、安全性高,基本满足了仓库管理的要求。整个系统由基本信息、单据中心、查询统计、报表打印、维护设置、帮助等模块组成。 本系统是在以MySql作为后台数据库,以J2EE为编程语言来开发的。仓库管理系统在运行阶段,效果好,数据准确性高,提高了工作效率,同时也实现了仓库管理计算机化。 关键词: 仓库; 管理系统; 数据库

java开发规范文档

一千零一夜产品部系统开发规范V1.0 一千零一夜途遇科技有限公司 2015-11-03

修改记录 目录 1前言 (4) 2开发管理 (4) 3项目周期 (4) 4命名规范 (5) 4.1项目编号命名规范 (5) 4.2文档命名规范 (5) 4.3路径管理 (5) 4.4jsp/html命名规范 (6) 4.5数据库命名规范 (8) 4.5.1表名规范 (8) 4.5.2字段规范 (8) 5文档规范 (8) 6代码规范 (9) 6.1Java源代码规范 (9) 6.1.1命名 (9) 6.1.2代码格式 (11) 6.1.3注释 (12) 6.1.4其他 (13) 6.2jsp/html代码规范 (13) 6.3数据库开发规范 (15) 6.3.1主键 (15) 6.3.2日期类型 (16) 6.3.3固定字段 (16) 6.3.4取值规范 (16) 6.3.5数据库开发工具 (16)

6.3.6Sql书写规范 (17) 6.4其他规范 (17) 7实战代码规范 (18) 7.1Java源代码规范 (18) 7.1.1java代码命名与格式 (18) 7.2jsp/html代码规范 (26) 8FAQ (29) 8.1Logic类中新增数据方法怎么写 (29) 8.2Logic类中修改数据方法怎么写 (30) 8.3Logic类中删除数据方法怎么写 (31) 8.4怎样创建一个没有底部按钮的窗口 (32) 8.5怎样设置弹出窗口的标题 (32) 8.6怎样重写提交数据的方法 (33) 8.7怎样创建单grid的页面 (33) 8.8怎样多个页签的grid的页面 (34) 8.9怎样创建左边树右边grid的页面 (34) 9代码检查规定 (34) 10附录1:JPA使用指南javax.persistence的注解配置 (34)

仓库管理系统的设计及实现报告

1 绪论 随着社会经济的不断发展,各个企业也面临着各种机遇和挑战。为了能够在这个信息化的时代继续发展下去,就必须紧跟上时代的脚步。随着网络技术的不断发展,现代物流技术也在不断的更新换代。传统的人工记载的办公方法已经无法满足很多企业的需要,因此,每个企业都需要一个自动化的仓库管理系统。仓库是每个企业都必须谨慎管理的地方,因为货物是企业最基本的本钱,只有很好地管理好自己企业的货物,才能在竞争如此激烈的社会中谋得一片天地。本课题正是根据这一理念,开发了一个功能比较完善,基本能满足企业要求的仓库管理系统。 1.1 系统开发背景 随着计算机技术的发展,一个崭新的信息化的世界已经展现在我们眼前。如今,你可以随处看到很多不同种类的信息管理系统。 商品是企业的根本,仓库是企业用来保存商品的地方。因此,仓库对于企业十分重要。所以说一个成功的企业必定会有一个好的仓库,而一个好的仓库就肯定会有一个先进的仓库管理系统作为支撑。但是,传统简单、静态的仓库管理系统,因为其不具备信息共享功能,且无法保证货物的正确的进库、库存控制和发货等问题,已经无法确保企业资源的高效利用;而且,传统的仓库管理系统存在维护困难、开发复杂等缺点,极大的浪费企业的人力、物力,因此已经跟不上时代的步伐。所以说,一个成功的企业需要一个现代的仓库管理系统来保证企业产品的精细化管理,保证最大化利用企业资源。 1.2 系统开发目的 仓库是所有企业都不可缺少的部分,因此,一个企业想要蓬勃发展,管理好自己的仓库就显得十分重要。但是仓库中的货物总是不断变动的,因此,就需要有人将仓库中货物的增减情况进行记录。但是传统的人工记录的方法存在着许多问题,比如信息安全行性低、查询效率低等。因此,对于一个想要不断发展的企业来说,这种人工记录的方式必须淘汰。 随着计算机技术的不断发展,计算机的使用已经十分普遍,每个企业都拥有计算机。使用计算机对库存信息进行管理有着很多人工记录所无法比拟的优点,比如查询快捷、信息安全性高、添加删除方便等。 基于以上这些原因,我开发了一个仓库管理系统。本系统能够保证货物的正确的

Java仓库管理系统报告

2016 —2017学年第一学期期末考试 《面向对象程序设计(Java)*》实践考核项目设计说明书 项目名称:仓库管理系统____________ 专业:计算机科学与技术___________________ 学号:____________________________________ 姓名:____________________________________ 任课教师:____________ 巩晨静______________

2016年12月3日 项目及要求 (一)考核容:Java 应用程序开发 (二)考核要求: 1.设计开发一个Java 应用程序,设计题目自拟; 2.要求学生熟练运用Java 程序设计的基本知识和技能; 3.要求学生掌握面向对象程序开发的基本思路和方法,熟悉软件开发过程; 4.要求学生利用面向对象的编程思想以及组件开发原理来完成系统的设计; 5.要求学生利用所学的基本知识和技能,进行应用程序设计,并体现自己的创新;6.要求学生独立完成,严禁拷贝与抄袭; 7.按照软件工程的思想,完成项目的需求分析、项目的功能框架、用户界面的设计、各功能模块的调试和运行等工作; 8.重视设计说明书文档的书写。 9.上交要求。要求学生上交设计说明书一份(Word 格式)电子及打印文档(A4 纸)各一份,源程序打包上传BB 平台。

专业资料

目录 第一章项目选题说明 (1) 第二章项目需求分析 (3) 第三章系统设计 (3) 3.1 设计思想 (3) 3.2 程序总体设计 (4) 3.3 程序详细设计 (5) 3.4 数据库的总体设计: (9) 第四章系统测试及实现 (14) 第五章总结 (17) 附录: (18)

Java安全开发规范

Java安全开发规范

第1章前言 为提高应用安全水平,特制定本规范对代码编制进行规范。 规范中的安全要求按照严格程度分为三级: Policy 必须遵循的策略,实现方法可以自定义,但不能外翻策略的规定。 Discipline 必须遵守的纪律,必须按照规定中的描述实施,绝对不能违反。 Guideline 建议性的指南和规范,将逐步要求遵循实施。 第2章Java安全性开发规范 2.1跨站脚本XSS ?风险及危害性: 跨站脚本XSS指利用网站漏洞从用户那里恶意盗取信息。用户在浏览网站、使用即时通讯软件、甚至在阅读电子邮件时,通常会点击其中的链接。攻击者通过在链接中插入恶意代码,就能够盗取用户信息。攻击者通常会用十六进制(或其他编码方式)将链接编码,以免用户怀疑它的合法性。网站在接收到包含恶意代码的请求之后会产成一个包含恶意代码的页面,而这个页面看起来就像是那个网站应当生成的合法页面一样。许多流行的留言本和论坛程序允许用户发表包含HTML和javascript的帖子。假设用户甲发表了一篇包含恶意脚本的帖子,那么用户乙在浏览这篇帖子时,恶意脚本就会执行,盗取用户乙的session信息。 如何导致XSS攻击,一般来说来自http的post,或者get方式取得参数值很可能为恶意代码,如果开发者直接用这些参数组合成http链接,用户点击该

连接,就会造成XSS攻击风险。 ?应对措施 开发者要保证代码的安全性,使其免受XSS攻击,可采取以下措施: 1.过滤或转换用户提交数据中的HTML代码。 2.限制用户提交数据的长度 ?非安全代码示例 <% String mofWindowId =request.getParameter("mofWindowId"); %>

?安全代码示例 <% String mofWindowId=XSSCheck.getParameter(request,”mofWindowId”); %> 注:XSSCheck为公用工具类,用于XSS检查,其getParameter实现逻辑如下: 1、通过参数名称,从请求中取得参数值。 2、将&,<,>,’,”转义: & -> & < -> ⁢ > -> > “ -> " ‘ -> ´ 3、返回安全的字符串。 2.2违反信任边界规则(Trust Boundary Violation) ?风险及危害 一个受信任的边界可以被认为是由系统划出的边境,例如session,attribute,aplication,数据库,文件等在服务端存储边界都认为是受信任的。反之来来自http的post,或者get方式取得参数值是不受信任的。凡

最新JAVA课程设计仓库管理系统资料

课程设计报告 (本科) 课程:Java 学号: 姓名: 班级: 教师: 时间:2014.11-2014.12 计算机学院

设计名称:仓库管理系统 设计内容、目的与要求: 随着社会发展和人们生活水平、质量的提高,资源管理和派发日益显得重要和突出,从而仓库应之而出。如何更高效地管理仓库资源,成了仓库管理中的当务之急。本仓库管理系统主要对小型仓库而提出的软件管理系统,让用户可以通过本系统进行便捷和高效管理仓库。 使用JAVA和SQL SERVER 2005开发小型仓库管理系统,对小型仓库的信息资源(商品、客户和供应商)、仓库物质动态(出库和进库)和基本的日常信息(仓库盘点和操作记录等)记录、管理和查询,并提供权限管理。本系统共分为个模块:基础信息管理、出入库管理、查询统计和系统管理。 计划与进度安排: 2014年11月10号~2014年11月19号:完成基本设计思路。 2014年11月20号~2014年11月29号:查找资料、分析例题并作出基本构思。2014年11月30号~2014年12月16号:完成程序设计、调试和修改。 2014年12月17号~2014年12月19号:修改并完成课程设计报告。 设计过程、步骤(可加页): 一开发与应用: 本系统主要采用MyEclipse和SQL SERVER 2005编程开发应用于PC机。二程序结构图:

三实体ER图:

四部分建表和程序: 1.1 系统中所用到的部分基本信息表及用途 表名用途 dbo.tb_gysinfo 供应商信息表 tb_spinfo 商品信息表 dbo.tb_khinfo 客户信息表 dbo.tb_kucun 库存信息表用于库存盘点 tb_userlist 操作员信息表用于登录程序 。。。。。。。。。。。。。 1.2 系统中所用到的部分类及用途 类名用途 JXCFrame.java 系统主程序,程序的开始位置 Dao.java 用于连接数据库和信息获取 Login.java 系统登录界面 KuCunPanDian.java 库存盘点 RuKuChaXun.java 入口查询 。。。。。。。。。。。 1.3 系统中所用到的主要方法及用途 方法名用途 createFrameButton为内部窗体添加Action的方法 Dao连接数据库和获取信息 Login()设计系统登录界面 GysXiuGaiPanel()供应商信息添加 GysTianJiaPanel()供应商信息修改与删除 。。。。。。。。。。。。 2.1.1 供应商信息表(dbo.tb_gysinfo)

相关文档
相关文档 最新文档