Java 运算符

Java 运算符 三目运算符(又称条件运算符) 三元运算符一般用的很少,因为它在程序段中的可读性很差,所以笔者建议不要经常使用三元运算符,但很少使用并不代表不使用,所以还是要掌握好它的用法,三元运算符的表达形式如下: 布尔表达式?值 0 : 值 1 它的运算过程是: 如果布尔表达式的结果是 true,就返回值 0,如果布尔表达式的结果是 false,就返回值 1,例如下面的程序段。 public class data21{ public static void main(String[] args){ int a=10; int b=20; System.out.println(“此三元运算式结果是: “+((a>b)?‘A’:‘B’)); } } 分析上面程序段: 因为"a"是小于"b”,所以"a>b"这个关系运算符的结果是"false”,既然是"false",那么选择值 1,即这个三元运算符的结果是"B"。 总结: 条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。 variable x = (expression) ? value if true : value if false 实例 public class Test { public static void main(String args[]){ int a , b; a = 10; b = (a == 1) ? 20: 30; System.out.println( “Value of b is : " + b ); ...

2012-05-03 · 1 min · 180 words · -

JMS

JMS jms即Java消息服务 (Java Message Service) 应用程序接口是一个Java平台中关于面向消息中间件 (MOM) 的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。JMS (Java Messaging Service) 是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。 JMS是一种与厂商无关的 API,用来访问消息收发系统。它类似于 JDBC(Java Database Connectivity): 这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持 JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,这只是几个例子。 JMS 使您能够通过消息收发服务 (有时称为消息中介程序或路由器) 从一个 JMS 客户机向另一个 JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成: 报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带: 简单文本 (TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。 Java消息服务是一个在 Java标准化组织 (JCP) 内开发的标准 (代号JSR 914) 。2001年6月25日,Java消息服务发布JMS 1.0.2b,2002年3月18日Java消息服务发布 1.1,统一了消息域。 JMS有以下元素组成。 JMS提供者 连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。 JMS客户 生产或消费基于消息的Java的应用程序或对象。 JMS生产者 创建并发送消息的JMS客户。 JMS消费者 接收消息的JMS客户。 JMS消息 包括可以在JMS客户之间传递的数据的对象 JMS队列 一个容纳那些被发送的等待阅读的消息的区域。队列暗示,这些消息将按照顺序发送。一旦一个消息被阅读,该消息将被从队列中移走。 JMS主题 一种支持发送消息给多个订阅者的机制 JMS模型 Java消息服务应用程序结构支持两种模型: ...

2012-04-29 · 1 min · 206 words · -

rt.jar 源码

rt.jar 源码 http://topic.csdn.net/u/20110125/10/06139927-2e44-4c76-b41c-fa7ea3206dd3.html java全部源代码,src.zip中没有的,在openjdk里的源代码加到eclipse里面.. 本来想问的.现在摸索出来了..可以到 http://download.java.net/openjdk/jdk6/下载源码 或者搜索 openjdk jdk6 ..如果你的jdk是jdk 5 或者jdk 7.那就搜索 openjdk jdk5 或者 openjdk jdk7.. 下载完以后解压缩.. eclipse里面选中 windows -preference-java-installed jres-选中jre6(你的可能是jre5 或者jre7)-edit-选中rt.jar-source attachment-external folders.. 选中解压缩的openjdk目录下的子目录 解压所在目录/jdk/src/share/classes/ ..然后重启eclipse.. 这样子原来添加src.zip所不能看的源代码,比如rt.jar下sun.misc包里的class..现在就可以看源代码了..

2012-04-28 · 1 min · 30 words · -

javac, java

javac, java public class Foo{ public static void main(String[] args) { System.out.println("foo"); } } javac Foo.java java Foo https://zhuanlan.zhihu.com/p/36529847

2012-04-17 · 1 min · 19 words · -

java -cp

java cp http://quicker.iteye.com/blog/856722 java -cp .;c:dir1lib.jar Test -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,windows上分号";“分隔,linux上是冒号”:“分隔。不支持通配符,需要列出所有jar包,用一点”.“代表当前路径。 虽然现在都有 eclipse 之类的 IDE 了,但有时候后会手工编译和运行一些程序,很多人包括多年开发经验的人都不知道怎么在命令行参 数运行类。有点杯具…… 使用范例: java -cp ..libhsqldb.jar org.hsqldb.Server -database mydb 或 java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 mydb -cp <class search path of directories and zip/jar files>

2012-04-17 · 1 min · 42 words · -

Class 文件内容, 方法区, 常量池

Class 文件内容, 方法区, 常量池 当JVM运行Java程序的时候,它会加载对应的 class文件,并提取class文件中的信息存放在JVM开辟出来的方法区内存中。那么这个 class 文件里面到底有些什么内容呢? 一、class文件内容概述 class文件是由8bits的字节流组成,全部字节构成了15个有意义的项目。这些项目之间没有任何无意义的字节,因此class文件非常紧凑。占据多字节空间的项目按照高位在前的顺序存放。下面我们详细讨论这些项目: magic (魔数) 每个class文件的前4个字节称为魔数,值为 0xCAFEBABE。作用在于轻松的辨别class文件与非class文件。 minor_version、major_version(次、主版本号) 各占2个字节。随着Java技术的发展,class文件的格式会发生变化。版本号的作用在于使得虚拟机能够认识当前加载class的文件格式。从而准确的提取class文件信息。 constant_pool_count 、constance_pool (常量池) 从这里开始的字节组成了常量池 。 存储了诸如符号常量、final常量值、基本数据类型的字面值等内容。JVM会将每一个常量构成一个常量表,每个常量表都有自己的入口地址。而实际上在JVM会将这些常量表存储在方法区中一块连续的内存空间中,因此class文件会根据常量表在常量池中的位置对其进行索引。比如常量池中的第一个常量表的索引值就是1,第二个就是2。有的时候常量表A需要常量表B的内容,则在常量表A中会存储常量表B的索引值x。而 constant_pool_count 就记录了有多少个常量表,或者所有多少个索引值。实际上,常量池中没有索引值为0的常量表,但这缺失的索引值也被记录在constant_pool_count中,因此 constant_pool_count等于常量表的数量加1。关于常量池的具体内容,我们会在下面详细讲述,并用一个例子来显示整个class文件的内容。 access_flags(访问标志) 占用2个字节。用来表明该class文件中定义的是类还是接口,访问修饰符是public还是缺省。类或接口是否是抽象的。类是否是final的。 this_class 占用2个字节。 它是一个对常量池的索引。指向的是常量池中存储类名符号引用的CONSTANT_Class_info常量表(见下面常量池具体结构)。比如this_class=0x0001。则表示指向常量池中的第一个常量表。通常这个表是指向当前class文件所定义的类名。 super_class 占用2个字节 与this_class类似,指向存放当前class文件所定义类的超类名字的索引的CONSTANT_Class_info常量表。 inteface_count、interfaces interface_count 是class文件所定义的类直接实现的接口或父类实现的接口的数量。占2个字节。intefaces包含了对每个接口的 CONSTANT_Class_info常量表的索引。 fields_count、fields fields_count 表明了类中字段的数量 。fields是不同长度的field_info表的序列。这些field_info表中并不包含超类或父接口继承而来的字段。field_info表展示了一个字段的信息,包括字段的名字,描述符和修饰符。如果该字段是final的,那么还会展示其常量值。注意,这些信息有些存放在field_info里面,有些则存放在field_info所指向的常量池中。下面我们阐述一下这个field_info表的格式: access_flags(2byte 访问修饰符) name_index(2byte 存储字段名的常量表在常量池中的索引) description_index(2byte 存储字段的所属类型的常量表在常量池中的索引) attribute_count(2byte 属性表的数量) attribute (属性) 其中attribute是由多个attribute_info组成。而JVM规范定义了字段的三种属性: ConstanceValue、Deprecated和Synthetic。 method_count、methods 与字段类似,method_count表明类中方法的数量和每个方法的常量表的索引。methods表明了不同长度的method_info表的序列。该表格式如下: access_flags(2byte 访问修饰符) name_index(2byte 存储方法名的常量表在常量池中的索引) description_index(2byte 存储方法的返回类型和参数类型的常量表在常量池中的索引) attribute_count(2byte 属性表的数量) attribute (属性) 其中方法的属性JVM规定了四种: Code,Deprecated,Exceptions,Synthetic。 常量池的具体结构 在Java程序中,有很多的东西是永恒的,不会在运行过程中变化。比如一个类的名字,一个类字段的名字/所属类型,一个类方法的名字/返回类型/参数名与所属类型,一个常量,还有在程序中出现的大量的字面值。比如下面小段源码红色显示的东西。 public class ClassTest { ...

2012-04-15 · 7 min · 1372 words · -

JRockit

JRockit Oracle JRockit (原来的 Bea JRockit) 系列产品是一个全面的Java运行时解决方案组合,包括了行业最快的标准Java解决方案。 大量的行业基准测试显示,基本JRockit JVM是世界上最快的JVM。JRockit面向延迟敏感型应用的解决方案JRockit Real Time提供以毫秒或微秒计的JVM响应时间,适合财务前端办公、军事指挥与控制和电信网络的需要。使用JRockit产品,客户已经体验到了显著的性能 提高 (一些超过了70% ) 和硬件成本的减少 (达50%) 。 Oracle JRockit 5.0是专门为在基于英特尔处理器的高性能服务器上运行大规模的关键任务型的服务器端应用而设计,包括支持64位的英特尔至强和英特尔安腾处理器。 最新版本的BEA JRockit 5.0支持多种平台,包括Solaris OS、Red Flag Linux服务器以及基于SPARC的系统,它通过专为改进应用可靠性而设计的BEA JRockit Mission Control套件提供了前所未有的控制能力。JRockit的确定性功能对即将推出的BEA WebLogic实时版本而言至关重要,后者能够提供可预测的实时应用响应。当应用响应时间以毫秒来衡量时,BEA WebLogic实时版本可以满足服务级别协议(SLA)的需求,如垃圾收集停顿时间,并提供可预测的性能。 BEA系统有限公司首席技术官Rob Levy说:“我们专注于持续创新,以帮助我们的客户迅速、高效率地部署企业应用。作为全球速度最快的面向大规模、关键任务型服务器端应用的Java虚拟机(JVM),JRockit令人印象深刻,它已建立起行业标准。” JRockit 5.0拥有一系列创新功能,帮助开发人员在工作效率、可管理性、性能和稳定性方面达到新水平。除了继续支持运行在Intel®处理器平台上的 Windows和Linux外,JRockit还首次可用于基于Solaris OS和SPARC的系统上。此外,BEA还与中科红旗软件公司达成协议,将BEA JRockit与Red Flag Linux服务器捆绑,为中国客户如中国邮政总局提供高性能的J2EE解决方案。今天,通过选择业界最快的Java虚拟机BEA JRockit,企业可在多种硬件平台和混合环境中使用单一的Java虚拟机,因为BEA JRockit为各种生产环境提供了一致的管理体验。 BEA JRockit Mission Control套件提供了可单独使用的性能工具,它为BEA JRockit的最新版本提供了补充。这个套件由几个独特的性能管理工具组成,可以监控、管理、分析及排除Java应用中的内存泄漏问题,而不会带来通常与这类工具有关的性能消耗问题,也不需要重启服务器来启动故障排除进程。BEA JRockit Mission Control套件包括三个工具,为开发人员和系统管理员提供了前所未有的实时可见性和控制能力。这些功能可以帮助开发人员通过改变使用模式和业务环境, 来调整应用性能、确保系统质量。这些新工具包括: ·BEA JRockit管理控制台。该工具捕获并展现有关垃圾收集停顿、内存利用和CPU使用的实时数据,以及来自Java虚拟机内部MBean服务器里面的JMX MBean信息。这项功能为开发人员和系统管理员控制网络内多个Java虚拟机实例提供了实时可见性和控制能力。 ·BEA JRockit运行时分析器(JRA)。JRA就像是一个随需应变的"飞行记录器",可以详细记录有Java虚拟机及应用运行的详细数据,帮助开发人员查看和分析应用在生产环境中的状况。 ·BEA JRockit内存泄漏检测器。这是一种实时分析工具,用于发现和查找导致内存泄漏的原因。 BEA JRockit为WebLogic Real Time(WebLogic实时版本)产品提供坚实基础 BEA WebLogic实时版本旨在提供可预测的应用响应速率,以确保对时间敏感的交易能顺利进行,不会发生出乎意料的延迟。借助轻便的Spring框架,开发 人员能够得到混合开发环境的所有好处,同时维持原先无法企及的可预测执行时间。有了BEA JRockit及其独特的确定性垃圾收集器(仅作为即将推出的BEA WebLogic实时版本的一部分发布),就能够把Java技术应用于原本只有采用C语言编程才能实现的高性能应用领域。 BEA系统有限公司Java运行时产品部总经理Guy Churchward说:“在金融服务行业,成本中心并不仅仅是业务部门的一部分,它本身就是一种业务。WebLogic实时版本的目标就是要提高性能, 使业务部门的决策者能够确信:WebLogic实时版本可以满足他们在关键任务型应用响应方面的需求。”

2012-04-15 · 1 min · 70 words · -

JVM调优

JVM调优 http://pengjiaheng.iteye.com/blog/518623 数据类型 Java虚拟机中,数据类型可以分为两类: 基本类型和引用类型。基本类型的变量保存原始值,即: 他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值"代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。 基本类型包括: byte,short,int,long,char,float,double,Boolean,returnAddress 引用类型包括: 类类型,接口类型和数组。 堆与栈 堆和栈是程序运行的关键,很有必要把他们的关系说清楚。 栈是运行时的单位, 而堆是存储的单位 栈解决程序的运行问题,即程序如何执行, 或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。 在 Java 中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当前线程 (或程序) 相关的信息。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。 为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗? 第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。 第二,堆与栈的分离,使得堆中的内容可以被多个栈共享 (也可以理解为多个线程访问同一个对象) 。这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如: 共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。 第三,栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。 第四,面向对象就是堆和栈的完美结合。其实,面向对象方式的程序与以前结构化的程序在执行上没有任何区别。但是,面向对象的引入,使得对待问题的思考方式发生了改变,而更接近于自然方式的思考。当我们把对象拆开,你会发现,对象的属性其实就是数据,存放在堆中;而对象的行为 (方法) ,就是运行逻辑,放在栈中。我们在编写对象的时候,其实即编写了数据结构,也编写的处理数据的逻辑。不得不承认,面向对象的设计,确实很美。 在Java中,Main 函数就是栈的起始点,也是程序的起始点 程序要运行总是有一个起点的。同C语言一样,java中的Main就是那个起点。无论什么java程序,找到main就找到了程序执行的入口: ) 堆中存什么?栈中存什么? 堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4btye的引用 (堆栈分离的好处: ) ) 。 为什么不把基本类型放堆中呢?因为其占用的空间一般是1~8个字节——需要空间比较少,而且因为是基本类型,所以不会出现动态增长的情况——长度固定,因此栈中存储就够了,如果把他存在堆中是没有什么意义的 (还会浪费空间,后面说明) 。可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的。但是基本类型、对象引用和对象本身就有所区别了,因为一个是栈中的数据一个是堆中的数据。最常见的一个问题就是,Java中参数传递时的问题。 Java中的参数传递时传值呢?还是传引用? 要说明这个问题,先要明确两点: 不要试图与C进行类比,Java中没有指针的概念 程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引用的问题。不会直接传对象本身。 明确以上两点后。Java在方法调用传递参数时,因为没有指针,所以它都是进行传值调用 (这点可以参考C的传值调用) 。因此,很多书里面都说Java是进行传值调用,这点没有问题,而且也简化的C中复杂性。 但是传引用的错觉是如何造成的呢?在运行栈中,基本类型和引用的处理是一样的,都是传值,所以,如果是传引用的方法调用,也同时可以理解为"传引用值"的传值调用,即引用的处理跟基本类型是完全一样的。但是当进入被调用方法时,被传递的这个引用的值,被程序解释 (或者查找) 到堆中的对象,这个时候才对应到真正的对象。如果此时进行修改,修改的是引用对应的对象,而不是引用本身,即: 修改的是堆中的数据。所以这个修改是可以保持的了。 对象,从某种意义上说,是由基本类型组成的。可以把一个对象看作为一棵树,对象的属性如果还是对象,则还是一颗树 (即非叶子节点) ,基本类型则为树的叶子节点。程序参数传递时,被传递的值本身都是不能进行修改的,但是,如果这个值是一个非叶子节点 (即一个对象引用) ,则可以修改这个节点下面的所有内容。 堆和栈中,栈是程序运行最根本的东西。程序运行可以没有堆,但是不能没有栈。而堆是为栈进行数据存储服务,说白了堆就是一块共享的内存。不过,正是因为堆和栈的分离的思想,才使得Java的垃圾回收成为可能。 Java中,栈的大小通过-Xss来设置,当栈中存储数据比较多时,需要适当调大这个值,否则会出现java.lang.StackOverflowError异常。常见的出现这个异常的是无法返回的递归,因为此时栈中保存的信息都是方法返回的记录点。 Java对象的大小 基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。 在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句: Object ob = new Object(); 这样在程序中完成了一个Java对象的生命,但是它所占的空间为: 4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都必须是大于8byte。 ...

2012-04-14 · 6 min · 1078 words · -

Maven内置属性、POM属性

Maven内置属性、POM属性 Maven内置属性、POM属性, maven properties 内置属性(Maven预定义,用户可以直接使用) ${basedir}表示项目根目录,即包含pom.xml文件的目录; ${version}表示项目版本; ${project.basedir}同${basedir}; ${project.baseUri}表示项目文件地址; ${maven.build.timestamp}表示项目构件开始时间; ${maven.build.timestamp.format}表示属性${maven.build.timestamp}的展示格式,默认值为yyyyMMdd-HHmm,可自定义其格式,其类型可参考java.text.SimpleDateFormat。 用法: <maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format> POM属性(使用pom属性可以引用到pom.xml文件对应元素的值) ${project.build.directory} 项目构建输出目录,默认为target/ ${project.build.outputDirectory} 项目主代码编译输出目录,默认为target/classes/ ${project.build.testOutputDirectory}:项目测试代码编译输出目录,默认为target/testclasses/ ${project.build.sourceEncoding} 表示主源码的编码格式; ${project.build.sourceDirectory} 项目的主源码目录,默认为src/main/java/ ${project.build.testSourceDirectory} 项目的测试源码目录,默认为/src/test/java/ ${project.build.finalName} 表示输出文件名称; ${project.version} 表示项目版本,与${version}相同; ${project.groupId}:项目的groupId ${project.artifactId} 项目的artifactId 用法: <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> ${project.build.outputDirectory}/META-INF/xxx/xxx

2012-04-09 · 1 min · 36 words · -

JAR WAR EAR

JAR WAR EAR jar: Java Archive file 扩展名为.Jar 包含Java类的普通库(class)、资源 (resources) 、辅助文件 (auxiliary files) , properties 等部署文件 application-client.xml JAR: Software developers generally use .jar files to distribute Java applications or libraries, in the form. of classes and associated metadata and resources (text, images, etc.) JAR files build on the ZIP file format. 查看jar归档目录 jar -vtf xxx.jar war: Web Archive file/web application archive 扩展名为.War, 包含全部Web应用程序, Servlet、JSP、JSP标记库、JAR库文件、HTML/XML文档和其他公用资源文件,图片、音频. 一个Web应用程序被定义为单独的一组文件、类和资源,用户可以对jar文件进行封装,并把它作为小型服务程序 (servlet) 来访问。 部署文件: web.xml ...

2012-04-08 · 7 min · 1383 words · -

MANIFEST.MF

MANIFEST.MF 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介绍MANIFEST.MF文件的内容,先来看struts.jar中包含的MANIFEST.MF文件内容: Manifest-Version: 1.0 Created-By: Apache Ant 1.5.1 Extension-Name: Struts Framework Specification-Title: Struts Framework Specification-Vendor: Apache Software Foundation Specification-Version: 1.1 Implementation-Title: Struts Framework Implementation-Vendor: Apache Software Foundation Implementation-Vendor-Id: org.apache Implementation-Version: 1.1 Class-Path: commons-beanutils.jar commons-collections.jar commons-digester.jar commons-logging.jar commons-validator.jar jakarta-oro.jar struts-legacy.jar 如果我们把MANIFEST中的配置信息进行分类,可以归纳出下面几个大类: 一. 一般属性 Manifest-Version 用来定义manifest文件的版本,例如: Manifest-Version: 1.0 Created-By 声明该文件的生成者,一般该属性是由jar命令行工具生成的,例如: Created-By: Apache Ant 1.5.1 Signature-Version 定义jar文件的签名版本 Class-Path 应用程序或者类装载器使用该值来构建内部的类搜索路径 二. 应用程序相关属性 Main-Class 定义jar文件的入口类,该类必须是一个可执行的类,一旦定义了该属性即可通过 java -jar x.jar来运行该jar文件。 三. 小程序(Applet)相关属性 Extendsion-List 该属性指定了小程序需要的扩展信息列表,列表中的每个名字对应以下的属性 -Extension-Name ...

2012-04-08 · 1 min · 139 words · -

DBCP

DBCP DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包: common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。 class JdbcUtil { private static BasicDataSource bds; static { if(bds==null) { bds= new BasicDatasource(); } //分别设置数据库的连接参数 bds.setDriverClass bds.url bds.user bds.root } public staitc Connection getConnection() { return bds.getConnection(); } 在spring中配置dbcp: beans.xml: <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <value>classpath:jdbc.properties</value> </property> </bean> <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> jdbc.properties: //放在classpath下 ...

2012-03-27 · 1 min · 76 words · -

golang log

golang log seelog https://github.com/cihub/seelog log, glog, logrus https://sites.google.com/site/kjellhedstrom2/g2log-efficient-background-io-processign-with-c11/g2log-vs-google-s-glog-performance-comparison https://logmatic.io/blog/our-guide-to-a-golang-logs-world/ https://www.goinggo.net/2013/11/using-log-package-in-go.html http://legendtkl.com/2016/03/11/go-log/ log 首先是golang自带的package log。使用godoc查看,godoc -http=:8001,然后就可以在localhost:8001/pkg/log就可以查看了。 最重要的是SetOutput这个函数,原型是func SetOutput(w io.Writer),决定了log应该输出到什么地方,默认是标准输出。下面是把log输出到文件的一个简单代码示例。 package main import ( “log” “os” ) func main() { f, err := os.OpenFile(“logfile.log”, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf(“file open error : %v”, err) } defer f.Close() log.SetOutput(f) log.Println(“This is a test log entry”) } 我们此时打开文件logfile.log,会看到文件内容如下。 2016/03/11 17:54:10 This is a test log entry 有时候我们并不需要前面的日期以及时间信息,比如做自动化测试的时候比对log肯定不希望有时间信息。那应该怎么办呢?这时候就该SetFlags()出场了。 package main import ( “log” “os” ) func main() { f, err := os.OpenFile(“logfile.log”, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) ...

2012-01-08 · 2 min · 278 words · -

Session

Session session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的。 session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。 有时候我们可以看到这样的话"在一个浏览器会话期间,…",这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间 ①。 最混乱的是"用户 (客户端) 在一次会话期间"这样一句话,它可能指用户的一系列动作 (一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction) ,然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差别只能靠上下文来推断②。 然而当session一词与网络协议相关联时,它又往往隐含了"面向连接"和/或"保持状态"这样两个含义, “面向连接"指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态"则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有"一个TCP session"或者 “一个POP3 session"③。 而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。 有时候session也用来指这种解决方案的存储结构,如"把xxx保存在session 里"⑤。 由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。 鉴于这种混乱已不可改变,本文中session一词的运用也会根据上下文有不同的含义,请大家注意分辨。 在本文中,使用中文"浏览器会话期间"来表达含义①, 使用"session机制"来表达含义④, 使用"session"表达含义⑤, 使用具体的"HttpSession"来表达含义⑥ HTTP协议与状态保持 HTTP 协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的 (非会员制) 大卖场之间的关系一样。 然而聪明 (或者贪心?) 的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用,就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范以响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、 cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。 让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案: 该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。 发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。 发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。 由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。 理解cookie机制 cookie机制的基本原理就如上面的例子一样简单,但是还有几个问题需要解决: “会员卡"如何分发;“会员卡"的内容;以及客户如何使用"会员卡”。 正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。 而cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。 cookie的内容主要包括: 名字,值,过期时间,路径和域。 其中域可以指定某一个域比如 .google.com,相当于总店招牌,比如宝洁公司,也可以指定一个域下的具体某台机器比如 www.google.com 或者 froogle.google.com,可以用飘柔来做比。 路径就是跟在域名后面的URL路径,比如/或者/foo等等,可以用某飘柔专柜做比。 路径与域合在一起就构成了cookie的作用范围。 如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。 存储在硬盘上的cookie 可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按 Ctrl-N (或者从文件菜单) 打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie;对于 Mozilla Firefox0.8,所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。 下面就是一个goolge设置cookie的响应头的例子 HTTP/1.1 302 FoundLocation: http://www.google.com/intl/zh-CN/Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.comContent-Type: text/html 这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分 ...

2012-01-08 · 1 min · 166 words · -

AOP

AOP AOP为Aspect Oriented Programming的缩写,意为: 面向切面编程 (也叫面向方面) ,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。 为什么要区分J2EE容器和J2EE应用系统? 我们知道,J2EE应用系统只有部署在J2EE容器中才能运行,那么为什么划分为J2EE容器和J2EE应用系统? 通过对J2EE容器运行机制的分析 (见我的电子教材"EJB实用原理") ,我们可以发现: 实际上J2EE容器分离了一般应用系统的一些通用功能,例如事务机制、安全机制以及对象池或线程池等性能优化机制。 这些功能机制是每个应用系统几乎都需要的,因此可以从具体应用系统中分离出来,形成一个通用的框架平台,而且,这些功能机制的设计开发有一定难度,同时运行的稳定性和快速性都非常重要,必须经过长时间调试和运行经验积累而成,因此,形成了专门的J2EE容器服务器产品,如Tomcat JBoss、Websphere、WebLogic等。 从J2EE系统划分为J2EE容器和J2EE应用系统两个方面,我们已经看到一种分散关注的思路 (separation of concerns) 。 分散关注 将通用需求功能从不相关类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。 AOP就是这种实现分散关注的编程方法,它将"关注"封装在"方面"中。 AOP是什么? AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。 举例: 假设有在一个应用系统中,有一个共享的数据必须被并发同时访问,首先,将这个数据封装在数据对象中,称为Data Class,同时,将有多个访问类,专门用于在同一时刻访问这同一个数据对象。 为了完成上述并发访问同一资源的功能,需要引入锁Lock的概念,也就是说,某个时刻,当有一个访问类访问这个数据对象时,这个数据对象必须上锁Locked,用完后就立即解锁unLocked,再供其它访问类访问。 使用传统的编程习惯,我们会创建一个抽象类,所有的访问类继承这个抽象父类,如下: abstract class Worker{ abstract void locked(); abstract void accessDataObject(); abstract void unlocked(); } 缺点: accessDataObject()方法需要有"锁"状态之类的相关代码。 Java只提供了单继承,因此具体访问类只能继承这个父类,如果具体访问类还要继承其它父类,比如另外一个如Worker的父类,将无法方便实现。 重用被打折扣,具体访问类因为也包含"锁"状态之类的相关代码,只能被重用在相关有"锁"的场合,重用范围很窄。仔细研究这个应用的"锁",它其实有下列特性: “锁"功能不是具体访问类的首要或主要功能,访问类主要功能是访问数据对象,例如读取数据或更改动作。 “锁"行为其实是和具体访问类的主要功能可以独立、区分开来的。 “锁"功能其实是这个系统的一个纵向切面,涉及许多类、许多类的方法。因此,一个新的程序结构应该是关注系统的纵向切面,例如这个应用的"锁"功能,这个新的程序结构就是aspect (方面) 在这个应用中,“锁"方面 (aspect) 应该有以下职责: 提供一些必备的功能,对被访问对象实现加锁或解锁功能。以保证所有在修改数据对象的操作之前能够调用lock()加锁,在它使用完成后,调用unlock()解锁。 AOP应用范围 很明显,AOP非常适合开发J2EE容器服务器,目前JBoss 4.0正是使用AOP框架进行开发。 具体功能如下: Authentication 权限 Caching 缓存 Context passing 内容传递 ...

2012-01-07 · 1 min · 125 words · -

java中Class.getResource用法

java中Class.getResource用法 用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file = new File(“c:/test.txt”);这样用有什么问题,相信大家都知道,就是路径硬编码,对于JAVA精神来说,应用应该一次成型,到处可用,并且从现实应用来讲,最终生成的应用也会部署到Windows外的操作系统中,对于linux来说,在应用中用了c:/这样的字样,就是失败,所以,我们应该尽量避免使用硬编码,即直接使用绝对路径。 在Servlet应用中,有一个getRealPath(String str)的方法,这个方法尽管也可以动态地获得文件的路径,不秘直接手写绝对路径,但这也是一个不被建议使用的方法,那么,我们有什么方法可以更好地获得文件呢? 那就是Class.getResource()与Class.getResourceAsStream()方法,但很多人还是不太懂它的用法,因为很多人 (比如不久前的我) 都不知道应该传怎么样的参数给它,当然,有些人己经用得如火纯青,这些人是不需要照顾的,在此仅给不会或者还不是很熟的人解释一点点。 比如我们有以下目录 |-project |-src |-javaapplication |-Test.java |-file1.txt |-file2.txt |-build |-javaapplication |-Test.class |-file3.txt |-file4.txt 在上面的目录中,有一个src目录,这是JAVA源文件的目录,有一个build目录,这是JAVA编译后文件(.class文件等) 的存放目录 那么,我们在Test类中应该如何分别获得 file1.txt file2.txt file3.txt file4.txt这四个文件呢? 首先讲file3.txt与file4.txt file3.txt: 方法一: File file3 = new File(Test.class.getResource(“file3.txt”).getFile()); 方法二: File file3 = new File(Test.class.getResource("/javaapplication/file3.txt").getFile()); 方法三: File file3 = new File(Test.class.getClassLoader().getResource(“javaapplication/file3.txt”).getFile()); file4.txt: 方法一: File file4 = new File(Test.class.getResource("/file4.txt").getFile()); 方法二: File file4 = new File(Test.class.getClassLoader().getResource(“file4.txt”).getFile()); 很好,我们可以有多种方法选择,但是file1与file2文件呢?如何获得? 答案是,你只能写上它们的绝对路径,不能像file3与file4一样用class.getResource()这种方法获得,它们的获取方法如下 假如整个project目录放在c:/下,那么file1与file2的获取方法分别为 file1.txt 方法一: File file1 = new File(“c:/project/src/javaapplication/file1.txt”); ...

2012-01-02 · 1 min · 142 words · -

Java反射机制

Java反射机制 通过反射取对象的属性值 import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; public class ReflectTest { public static void main(String[] args) { Foo foo = new Foo(); foo.setBar("xxx"); Map map = new HashMap(); map.put("foo", "bar"); foo.setTags(map); Class fooClass = foo.getClass(); System.out.println("name:" + fooClass.getName()); try { Field[] fields = fooClass.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); System.out.println("field: " + field.getName()); Object obj = field.get(foo); System.out.println(obj); } Field field0 = fooClass.getDeclaredField("bar"); System.out.println(field0); } catch (Exception e) { e.printStackTrace(); } } } class Foo { private String bar; private Map<String, String> tags; public void setBar(String bar) { this.bar = bar; } public void setTags(Map tags) { this.tags = tags; } } Reflection 是Java被视为动态 (或准动态) 语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers (诸如public, static 等等) 、superclass (例如Object) 、实现之interfaces (例如Cloneable) ,也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。本文借由实例,大面积示范Reflection APIs。 ...

2012-01-02 · 6 min · 1215 words · -

java this super

java this super 在Java中,this通常指当前对象,super则指父类的。当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便 可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数,这些马上就要讨论。如果你想引用父类的某种东西,则非 super莫属。由于this与super有如此相似的一些特性和与生俱来的某种关系,所以我们在这一块儿来讨论,希望能帮助你区分和掌握它们两个。 在一般方法中 最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某 个成员,使用方法是"this.成员名",而不带this的那个便是形参。另外,还可以用"this.方法名"来引用当前对象的某个方法,但这时this 就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。下面的代码演示了上面的用法: public class DemoThis{ private String name; private int age; DemoThis(String name,int age){ setName(name); //你可以加上this来调用方法,像这样: this.setName(name);但这并不是必须的 setAge(age); this.print(); } public void setName(String name){ this.name=name;//此处必须指明你要引用成员变量 } public void setAge(int age){ this.age=age; } public void print(){ System.out.println(“Name="+name+” Age="+age);//在此行中并不需要用this,因为没有会导致混淆的东西 } public static void main(String[] args){ DemoThis dt=new DemoThis(“Kevin”,“22”); } } 这段代码很简单,不用解释你也应该能看明白。在构造函数中你看到用this.print(),你完全可以用print()来代替它,两者效果一样。下面我们修改这个程序,来演示super的用法。 class Person{ public int c; private String name; private int age; protected void setName(String name){ this.name=name; } protected void setAge(int age){ ...

2012-01-02 · 1 min · 191 words · -

java.lang.Class类

java.lang.Class类 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。 Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。 虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类 (型) 都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。 基本的 Java 类型 (boolean、byte、char、short、int、long、float 和 double) 和关键字 void 也都对应一个 Class 对象。 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。 一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。 一、如何得到Class的对象呢?有三种方法可以的获取: 调用Object类的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。例如: MyObject x; Class c1 = x.getClass(); 使用Class类的中静态forName()方法获得与字符串对应的Class对象。例如: Class c2=Class.forName(“MyObject”),Employee必须是接口或者类的名字。 获取Class类型对象的第三个方法非常简单。如果T是一个Java类型,那么T.class就代表了匹配的类对象。例如 Class cl1 = Manager.class; Class cl2 = int.class; Class cl3 = Double[].class; 注意: Class对象实际上描述的只是类型,而这类型未必是类或者接口。例如上面的int.class是一个Class类型的对象。由于历史原因,数组类型的getName方法会返回奇怪的名字。 二、Class类的常用方法 getName() 一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体 (类、接口、数组类、基本类型或 void) 名称。 newInstance() Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如: x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器 (无参数构造器) 初始化新建对象。 ...

2012-01-02 · 2 min · 276 words · -

数组

数组 线性表 (Linear List) 每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表… 数组支持随机访问,根据下标随机访问的时间复杂度为 O(1) 数组简单易用,在实现上使用的是连续的内存空间,可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。而链表在内存中并不是连续存储,所以对 CPU 缓存不友好,没办法有效预读。 一维数组的声明方式: type var[]; 或type[] var; 声明数组时不能指定其长度 (数组中元素的个数) , Java中使用关键字new创建数组对象,格式为: 数组名 = new 数组元素的类型 [数组元素的个数] 实例: TestNew.java: 程序代码: public class TestNew { public static void main(String args[]) { int[] s ; int i ; s = new int[5] ; for(i = 0 ; i < 5 ; i++) { s[i] = i ; } for(i = 4 ; i >= 0 ; i–) { System.out.println("" + s[i]) ; } } } 初始化: ...

2012-01-02 · 2 min · 256 words · -