META-INF, MANIFEST.MF

META-INF, MANIFEST.MF 做过 JAVA EE 开发的工程师应该都知道在 JAVA build 出来的 JAR 或者 WAR 的顶层目录下有个 META-INF 文件夹吧,可是有多少人能够清楚说出这个文件夹到底是做神马的? What is the purpose of META-INF? 恐怕不是都能说的清楚准确吧。 把这个问题抛出来,是因为我在公司的项目中发现 META-INF 这个文件夹被误用了,看来不是每个人都清楚 :) 所谓 META-INF, 说白了就是存放一些 meta information 相关的文件的这么一个文件夹, 一般来说尽量不要自己手工放置文件到这个文件夹。怎么理解这句话呢? 就是说这个文件夹应该被看作是 JAVA 工程的一个内部 META 目录,所以这个目录下的文件应该都是 build 工具来生成的。我们自己的文件应该直接放到根目录下或者其他的子目录中。 根据官方的 JAR file specification (http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html), 一个典型的 META-INF 目录下可能包含如下几种文件或者子目录: MANIFEST.MF: The manifest file that is used to define extension and package related data. INDEX.LIST x.SF x.DSA services/ 不过理想和现实总是有差距,现在即使一些著名的开源代码对 META-INF 的使用上都存在大的差异,类似 Apache CXF 中就有这样的Spring配置: ...

2014-01-01 · 1 min · 95 words · -

JavaEE Web 工程/项目 目录结构

JavaEE Web 工程/项目 目录结构 Maven 标准目录结构 好的目录结构可以使开发人员更容易理解项目,为以后的维护工作也打下良好的基础。Maven2根据业界公认的最佳目录结构,为开发者提供了缺省的标准目录模板。Maven2的标准目录结构如下: src/main/java Application/Library sources src/main/resources Application/Library resources src/main/webapp Web application sources src/test/java Test sources src/test/resources Test resources src/main/filters Resource filter files src/main/assembly Assembly descriptors src/main/config Configuration files src/main/scripts Application/Library scripts src/test/filters Test resource filter files src/site Site LICENSE.txt Project's license NOTICE.txt Notices and attributions required by libraries that the project depends on README.txt Project's readme 使用目录模板,可以使 pom.xml 更简洁。因为 Maven2 已经根据缺省目录,预定义了相关的动作,而无需人工的干预。以 resources 目录为例: ...

2014-01-01 · 1 min · 162 words · -

JavaEE 7

JavaEE 7 http://www.iteye.com/news/27980 甲骨文公司在2013年6月中旬正式发布了JavaEE 7 (JSR 342) 。 该版本特性主要集中在以下3个方面: 提供HTML5动态可伸缩应用程序 使用WebSocket,降低数据交换延迟,从而减少响应时间 支持标准JSON,简化便携式应用的数据解析 提供异步、可扩展、高性能的RESTful服务 提高开发人员的生产力 通过一个粘性集成平台,来简化应用程序架构 通过减少样板代码和广泛使用注解,来提高效率 通过对标准的RESTful web服务客户端支持,来增强应用程序的可移植性 满足最苛刻的企业需求 将批处理作业分解成可管理的块,以满足连续OLTP需求 轻松定义多线程并发任务,以提高可扩展性 提供可选的灵活的事务性应用程序 JavaEE 7提供了一个完整、全面、集成的堆栈来帮助你构建企业和Web应用程序。下面的这个图表有助于你了解这些组件之间是如何合作的。橙色部分为该版本中新添加的组件。 以下是JavaEE 7开发过程中14个活跃的JSR: 342: Java EE 7 Platform 338: Java API for RESTful Web Services 2.0 339: Java Persistence API 2.1 340: Servlet 3.1 341: Expression Language 3.0 343: Java Message Service 2.0 344: JavaServer Faces 2.2 345: Enteprise JavaBeans 3.2 346: Contexts and Dependency Injection 1.1 349: Bean Validation 1.1 ...

2014-01-01 · 1 min · 187 words · -

java illegal character \65279

‘java illegal character \65279’ http://blog.csdn.net/shixing_11/article/details/6976900 某些编辑器会往utf8文件中添加utf8标记 (editplus称其为签名) ,它会在文件开始的地方插入三个不可见的字符 (0xEF 0xBB 0xBF,即BOM) ,它的表示的是 Unicode 标记 (BOM) 。 因此要解决这个问题的关键就是把这个标记选项去掉,可按如下方法操作。 首先用editplus打开这个文件,从Doucument菜单中选择Permanet Settings,有三个分类,分别是General,File, Tools.点击File,右边会有一项是 UTF-8 signature: 选择 always remove signature. 点击OK 。中文版本的 Editplus 下操作的菜单结构如下: 文档->参数设置->文件->UTF-8签名->总是移除签名->确定 ,这样就设置了UTF-8格式不需要在文件前面加标记,最后把文件另存为utf-8格式就好了. 相关资料,网上摘抄: UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个"奎"的Unicode编码是594E,“乙"的Unicode编码是4E59。如果我们收到UTF-16字节流"594E”,那么这是"奎"还是"乙"?Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是"Bill Of Material"的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法: 在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF (读者可以用我们前面介绍的编码方法验证一下) 。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。Windows就是使用BOM来标记文本文件的编码方式的。原来BOM是在文件的开始加了几个字节作为标记。 扩展阅读: UTF-8, UTF-16, UTF-32 & BOM: http://www.unicode.org/faq/utf_bom.html#BOM W3C官方说明: http://www.w3.org/International/questions/qa-utf8-bom

2013-12-27 · 1 min · 66 words · -

Class.forName

Class.forName 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的对象呢?有三种方法可以的获取: 1、调用Object类的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。例如: MyObject x; Class c1 = x.getClass(); 2、使用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()方法调用默认构造器 (无参数构造器) 初始化新建对象。 ...

2013-12-21 · 4 min · 841 words · -

阻塞队列 BlockingQueue

阻塞队列 BlockingQueue 什么是阻塞队列 阻塞队列 (BlockingQueue) 是一个支持两个附加操作的队列。这两个附加的操作是: 在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 方法\处理方式 抛出异常 返回特殊值 一直阻塞 超时退出 插入方法 add(e) offer(e) put(e) offer(e,time,unit) 移除方法 remove() poll() take() poll(time,unit) 检查方法 element() peek() 不可用 不可用 抛出异常: 是指当阻塞队列满时候,再往队列里插入元素,会抛出IllegalStateException(“Queue full”)异常。当队列为空时,从队列里获取元素时会抛出NoSuchElementException异常 。 返回特殊值: 插入方法会返回是否成功,成功则返回true。移除方法,则是从队列里拿出一个元素,如果没有则返回null 一直阻塞: 当阻塞队列满时,如果生产者线程往队列里put元素,队列会一直阻塞生产者线程,直到拿到数据,或者响应中断退出。当队列空时,消费者线程试图从队列里take元素,队列也会阻塞消费者线程,直到队列可用。 超时退出: 当阻塞队列满时,队列会阻塞生产者线程一段时间,如果超过一定的时间,生产者线程就会退出。 Java里的阻塞队列 JDK7 提供了 7 个阻塞队列 ArrayBlockingQueue : 一个由数组结构组成的有界阻塞队列。 LinkedBlockingQueue : 一个由链表结构组成的有界阻塞队列。 PriorityBlockingQueue : 一个支持优先级排序的无界阻塞队列。 DelayQueue: 一个使用优先级队列实现的无界阻塞队列。 SynchronousQueue: 一个不存储元素的阻塞队列。 LinkedTransferQueue: 一个由链表结构组成的无界阻塞队列。 LinkedBlockingDeque: 一个由链表结构组成的双向阻塞队列。 在JDK1.5新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全"传输"数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。 认识BlockingQueue 阻塞队列,顾名思义,首先它是一个队列,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出; 常用的队列主要有以下两种: (当然通过不同的实现方式,还可以延伸出很多不同类型的队列,DelayQueue就是其中的一种) 先进先出 (FIFO) : 先插入的队列的元素也最先出队列,类似于排队的功能。从某种程度上来说这种队列也体现了一种公平性。 后进先出 (LIFO) : 后插入队列的元素最先出队列,这种队列优先处理最近发生的事件。 ...

2013-12-20 · 3 min · 447 words · -

Scala

Scala 发音为/ˈskɑːlə, ˈskeɪlə/ Java VS Scala 从定义上来说,Java是面向对象的编程语言,而Scala是函数式编程语言,这两门语言之间,本身也有一定的关联。 Scala来源于Java,又“高于”Java,在Java之上增加了一层编码的“API”,让程序员可以通过函数式编程的方式来开发程序。 Scala程序最终被编译为.class文件运行在JVM虚拟机中,所以它是JVM下的语言一种,在实际的大数据开发任务当中,Java和Scala都运行于JVM之上,也能更好地集成。 Scala编程语言近来抓住了很多开发者的眼球。如果你粗略浏览Scala的网站,你会觉得Scala是一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格。Christopher Diggins认为: 不太久之前编程语言还可以毫无疑义地归类成"命令式"或者"函数式"。Scala代表了一个新的语言品种,它抹平了这些人为划分的界限。 根据David Rupp在博客中的说法,Scala可能是下下一代Java。这么高的评价让人不禁想看看它到底是什么东西。 Scala有几项关键特性表明了它的面向对象的本质。例如,Scala中的每个值都是一个对象,包括基本数据类型 (即布尔值、数字等) 在内,连函数也是对象。另外,类可以被子类化,而且Scala还提供了基于mixin的组合 (mixin-based composition) 。 与只支持单继承的语言相比,Scala具有更广泛意义上的类重用。Scala允许定义新类的时候重用"一个类中新增的成员定义 (即相较于其父类的差异之处) “。Scala称之为mixin类组合。 Scala还包含了若干函数式语言的关键概念,包括高阶函数 (Higher-Order Function) 、局部套用 (Currying) 、嵌套函数 (Nested Function) 、序列解读 (Sequence Comprehensions) 等等。 Scala是静态类型的,这就允许它提供泛型类、内部类、甚至多态方法 (Polymorphic Method) 。另外值得一提的是,Scala被特意设计成能够与Java和.NET互操作。Scala当前版本还不能在.NET上运行 (虽然上一版可以-_-b) ,但按照计划将来可以在.NET上运行。 Scala可以与Java互操作。它用scalac这个编译器把源文件编译成Java的class文件 (即在JVM上运行的字节码) 。你可以从Scala中调用所有的Java类库,也同样可以从Java应用程序中调用Scala的代码。用David Rupp的话来说, 它也可以访问现存的数之不尽的Java类库,这让 (潜在地) 迁移到Scala更加容易。 这让Scala得以使用为Java1.4、5.0或者6.0编写的巨量的Java类库和框架,Scala会经常性地针对这几个版本的Java进行测试。Scala可能也可以在更早版本的Java上运行,但没有经过正式的测试。Scala以BSD许可发布,并且数年前就已经被认为相当稳定了。 说了这么多,我们还没有回答一个问题: “为什么我要使用Scala?“Scala的设计始终贯穿着一个理念: 创造一种更好地支持组件的语言。 (《The Scala Programming Language》,Donna Malayeri) 也就是说软件应该由可重用的部件构造而成。Scala旨在提供一种编程语言,能够统一和一般化分别来自面向对象和函数式两种不同风格的关键概念。 https://cloud.tencent.com/developer/article/1758874

2013-11-29 · 1 min · 59 words · -

JAVA生成随机汉字

JAVA生成随机汉字 http://blog.csdn.net/smilememory/article/details/8053599 首先我们得知道汉字编码的原理。 在国标GB2312-80中规定,所有的国标汉字及符号分配在一个94行、94列的方阵中,方阵的每一行称为一个"区",编号为01区到94区,每一列称为一个"位",编号为01位到94位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯数字就是它们的"区位码"。区位码的前两位是它的区号,后两位是它的位号。用区位码就可以唯一地确定一个汉字或符号,反过来说,任何一个汉字或符号也都对应着一个唯一的区位码。例如,汉字"辉"字的区位码是2752,表明它在方阵的27区52位。 所有的汉字和符号所在的区分为一下4个组。 (1) 01区到15区 图形符号区,其中01区到09区为标准符号区,10区到15区为自定义符号区。 (2) 16区到55区 一级常用汉字区,包括了3755个一级汉字。这40个区中的汉字是按汉语拼音排序的,同音字按笔画顺序。其中55区的90~94位未定义汉字。 (3) 56区到87区 二级汉字区,包括了3008个二级汉字,按部首排序。 (4) 88区到94区 自定义汉字区 其中,第10区到15区的自定义符号区和第88区到第94区的自定义汉字区可由用户自定义国标码中未定义的符号和汉字。 与汉字的区位码类似的还有汉字机内码,汉字机内码是在汉字的区码和位码上分别加上A0H (这里的H表示前两位数字为十六进制数) 而得到的。使用机内码表示的一个汉字占用两个字节,分别称为高位节和低位节,这两位字节的机内码按以下规则表示。 高位字节=区码+20H+80H(或区码+A0H) 地位字节=位码+20H+80H(或位码+A0H) 例如,汉字"啊"的区位码为1601, 区码和位码分别用十六进制表示即为1001H,它的机内码的高位字节为B0H,地位字节为A1H, 机内码就是B0A1H。 注意: 汉字的机内码都从第十六区B0开始,并且从区位D7开始以后的汉字都是很难见到的复杂汉字,可以将这些汉字排除掉。所以随机生成的汉字机内码的第一位范围在B C D 之间, 如果第 1 为 是D, 则第二位区位码就不能是7以后的十六进制数。由于每个区的第一个位置和最后一个位置是空的,没有汉字,因此随机生成的区位码的第 3 为如果是A, 第4位就不能是0;第三位如果是F,第四位就不能是F。 (以上来自《java web 程序开发范例宝典》明日科技 王国辉 陈丹丹 潘凯华编著 人民邮电出版社) 获得随机汉字的java代码 //获得随机的汉字 private String getRandomChinese(){ Random random = new Random(); int code1,code2,code3,code4;//分别代表四个位码 String checkCode = “”; String[] rBase = {“0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9”,“a”,“b”,“c”,“d”,“e”,“f”}; code1 = random.nextInt(3) +11; ...

2013-11-17 · 1 min · 171 words · -

TCP/IP 网络协议的通俗理解, socket,http,soap

TCP/IP 网络协议的通俗理解, socket,http,soap http://blog.csdn.net/eyeooo/article/details/7438267 前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑。主要是因为对网络协议不太熟悉,对一些概念也没弄清楚。后来我花了一些时间去了解这些网络协议,现在对TCP/IP网络协议有了初步的认识,在这里总结出来,可以梳理一下我对网络协议的理解,加深印象. 话说两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样。一个只懂英语的人,和一个只懂中文的人由于没有共同的语言 (规则) 就没办法沟通。两台电脑之间进行通讯所共同遵守的规则,就是网络协议。 那么谁来制定这个网络协议? 国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型。要制定通讯规则,内容会很多,比如要考虑A电脑如何找到B电脑,A电脑在发送信息给B电脑时是否需要B电脑进行反馈,A电脑传送给B电脑的数据的格式又是怎样的?内容太多太杂,所以OSI模型将这些通讯标准进行层次划分,每一层次解决一个类别的问题,这样就使得标准的制定没那么复杂。OSI模型制定的七层标准模型,分别是: 应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。 虽然国际标准化组织制定了这样一个网络协议的模型,但是实际上互联网通讯使用的网络协议是TCP/IP网络协议。 TCP/IP 是一个协议族,也是按照层次划分。共四层: 应用层,传输层,互连网络层,网络接口层。 那么TCP/IP协议和OSI模型有什么区别呢?OSI网络协议模型,是一个参考模型,而TCP/IP协议是事实上的标准。TCP/IP协议参考了OSI模型,但是并没有严格按照OSI规定的七层去划分标准,而只划分了四层,个人觉得这样会更简单点,当划分太多层次时,你很难区分某个协议是属于哪个层次的。TCP/IP协议和OSI模型也并不冲突,TCP/IP协议中的应用层协议,就对应于OSI中的应用层,表示层,会话层。就像以前有工业部和信息产业部,现在实行大部制后只有工业和信息化部一个部门,但是这个部门还是要做以前两个部门一样多的事情,本质上没有多大的差别。TCP/IP中有两个重要的协议,传输层的TCP协议和互连网络层的IP协议,因此就拿这两个协议做代表,来命名整个协议族了,在说TCP/IP协议时,是指整个协议族。 TCP/IP协议分为四个层次,但我们并不需要了解所有层次的协议,我觉得主要关注应用层和传输层的协议就可以了。拿寄送邮件举例, A寄邮件给B,A关心的是用什么格式写什么内容给B (应用层内容) ,是寄挂号信还是寄平信 (传输层内容) ,但是A是不会去关注邮件传送过程中采用了那条路线,邮递员是如何把信件递送到B手里的 (互连网络层,网络接口层) 。 先说传输层,传输层有多个协议,但最主要的是TCP和UDP协议。两则的区别在于TCP协议需要接收方反馈,UDP协议不需要接收方反馈。TCP就像挂号信,A电脑发信息给B电脑后,需要得到B电脑的反馈,这样A电脑就能知道B电脑是否已经收到信息。UDP就像平信,A电脑发信息给B电脑后,B电脑并不给A电脑发聩,A电脑发送信息出去后并不知道B电脑是否已经收到。 因此,TCP传输比UDP传送更可靠,但是TCP传输的效率就不如UDP了。至于,在传送过程中具体选择哪种传送方式,需要具体问题具体分析。在不可靠的网络传送过程中一般选择TCP传送方式。在讲求效率,或者不在乎传送失误的情况下可以选择UDP方式来提高传输速率。 应用层的协议有很多,每一个协议代表一种类型的服务。HTTP协议,万维网服务。FTP协议,文件传送服务。POP3,邮件服务,SOAP协议webService服务。 在理解TCP/IP协议的过程中,我遇到了三个困惑。 1.什么是socket? 以前有听说过socket编程这种说法,也有的说 socket 编程。我在搜索关于socket的资料时,发现有的说socket是指一个连接,有的说socket是一指一个端点。拿打电话做比喻,A电话机和B电话机正在通话,那么socket是指的A和B之间的连接线呢,还是指电话机 (端点) ? 我现在的理解是,socket就是一个连接中的一个端点,一次通讯 (连接) a,b端都会有一个socket。一个socket对应一个连接。 2.http协议属于应用层还是传输层? http 超文本传送协议,听上去像是传输层的协议一样。但事实上大家都知道http和ftp一样都是属于应用层的协议,我先前很纳闷的是,既然是应用层的协议,怎么就取这样一个误导人的名称啊。在对TCP/IP协议还不熟悉的时候,这很容易让人误解和纳闷的。后来,我在wiki上发现这么一段话: http中文译名问题 HTTP 在中国大陆被翻译为"超文本传输协议",因为"transfer"在中文里有"传输"的含意。但依据 HTTP 定制者之一的 Roy Fielding博士的论文[1] (6.5.3节) ,作者专门强调"transfer"表示的是" (表述状态的) 转移" (Representational State Transfer) ,而不是"传输" (transport) 。故其中文译名"超文本传输协议"恰恰引种反映了这种误解。更符合原义的译名应该为"超文本转移协议"。 这段话解除了我的疑惑。那么http协议当然是应用层的协议。 3.SOAP可以使用HTTP协议进行传输吗? 在了解SOAP协议的过程中,看到介绍说soap可以通过tcp,udp,http协议来传送。这也是让人困惑的描述。一看这句话,就会感觉http怎么和tcp,udp协议并列了呢?难道http还是属于传输层的协议?再加上http中文译名的问题,名字听上去像传输层,初学者又要开始头大了。 事实上,http是应用层的协议,这一点可以毫无怀疑。那么现在新的问题来了。soap和http都是应用层协议,怎么说soap能用http协议来传输呢?应用层的协议可以用应用层的协议传送吗? 我查阅了资料,是这样一回事情,soap将信息进行XML的序列化后,再用http协议的方式再打包进行传送,传送的方式还是tcp或者udp。做个比喻就好理解了。tcp 和 udp 都是公路,暂且把tcp认为是一般公路,udp高速公路,soap和http就都是汽车,那么soap和http都可以在tcp和udp上跑。说soap可以通过http来传送,实际就是说soap是小轿车,http是装轿车的卡车,把soap的信息装到http里面,然后再运输,当然走的道路还是tcp或udp。 说soap可以通过http协议来传输,这句话不太准确,比较准确第说法是: soap信息可以通过http协议包装后通过tcp或udp传输。

2013-11-17 · 1 min · 67 words · -

Netty

Netty version latest 4.1.68 current 4.1.22 Netty是Java领域有名的开源网络库,特点是高性能和高扩展性,因此很多流行的框架都是基于它来构建的,比如我们熟知的Dubbo、Rocketmq、Hadoop等 Netty是由JBOSS提供的一个java开源框架. Netty提供异步的, 事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序. 也就是说,Netty 是一个基于NIO的客户,服务器端编程框架, 使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。 “快速"和"简单"并不意味着会让你的最终应用产生维护性或性能上的问题。Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。 netty uml @startuml interface ChannelHandlerContext interface ResourceLeakHint class NioEventLoop{ protected void run() private void processSelectedKeys() private void processSelectedKeysOptimized() private void processSelectedKey(SelectionKey k, AbstractNioChannel ch) } class AbstractNioByteChannel class NioByteUnsafe{ public final void read() } class DefaultChannelPipeline{ AbstractChannelHandlerContext head public final ChannelPipeline fireChannelRead(Object msg) } class HeadContext class AbstractChannelHandlerContext { AbstractChannelHandlerContext next AbstractChannelHandlerContext prev DefaultChannelPipeline pipeline ChannelHandlerContext fireChannelRead(final Object msg) AbstractChannelHandlerContext findContextInbound() void invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) void invokeChannelRead(Object msg) boolean invokeHandler() } DefaultAttributeMap<|--AbstractChannelHandlerContext ChannelHandlerContext<|--AbstractChannelHandlerContext ResourceLeakHint<|--AbstractChannelHandlerContext DefaultChannelPipeline <|- AbstractChannelHandlerContext HeadContext <|- DefaultChannelPipeline class SimpleChannelInboundHandler { public void channelRead(ChannelHandlerContext ctx, Object msg) public void channelActive(ChannelHandlerContext ctx) } ChannelInboundHandlerAdapter<|--SimpleChannelInboundHandler class ServerBootstrap class AbstractBootstrap interface Cloneable Cloneable<|--AbstractBootstrap AbstractBootstrap<|--ServerBootstrap @enduml 时序图 @startuml SingleThreadEventExecutor -> NioEventLoop: run() NioEventLoop -> NioByteUnsafe: read() AbstractChannelHandlerContext -> AbstractChannelHandlerContext: ChannelHandlerContext fireChannelRead(final Object msg) AbstractChannelHandlerContext -> AbstractChannelHandlerContext: AbstractChannelHandlerContext findContextInbound(int mask) AbstractChannelHandlerContext -> AbstractChannelHandlerContext: invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) AbstractChannelHandlerContext -> ChannelHandler: invokeChannelRead(Object msg) ChannelHandler --> Handler0: channelRead @enduml https://netty.io/4.1/api/io/netty/channel/ChannelPipeline.html ...

2013-11-17 · 2 min · 273 words · -

java 循环/loop while,for,foreach

‘java 循环/loop while,for,foreach’ while( 布尔表达式 ) { //循环内容 } do { //代码语句 }while(布尔表达式); JAVA for循环执行顺序 及 i++和++i的区别 1.i与i++的区别是: ++i 是先执行 i=i+1 再使用 i 的值,而 i++ 是先使用 i 的值再执行 i=i+1。 2.但是如果不了解 for 循环的执行顺序则容易出错。 for循环的执行顺序如下: for(sta1;sta2;sta3) { sta4; } 1.进入循环执行sta1;//只是进入的时候执行. 2.执行sta2;//条件为真才执行sta4,不然就跳出for了. 3,执行sta4; 4,执行sta3; 5,再回到第2步开始执行 Java5新特征之foreach语句使用总结 foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。 foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。 foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为"foreach"语句。从英文字面意思理解foreach也就是"for 每一个"的意思。实际上也就是这个意思。 foreach的语句格式: for(元素类型t 元素变量x : 遍历对象obj){ 引用了x的java语句; } 下面通过两个例子简单例子看看foreach是如何简化编程的。代码如下: 一、foreach简化数组和集合的遍历 import java.util.Arrays; import java.util.List; import java.util.ArrayList; /** Created by IntelliJ IDEA. User: leizhimin Date: 2007-12-3 Time: 16:58:24 Java5新特征之foreach语句使用总结 */ public class TestArray { ...

2013-11-16 · 2 min · 350 words · -

JRE和JDK的区别

JRE和JDK的区别 JDK JDK 是整个Java的核心,包括了Java运行环境(JRE) (Java Runtime Envirnment), 一堆Java工具和Java基础的类库 (rt.jar) 。不论什么Java应用服务器实质都是内置了某个版本的JDK.最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM (Java Virtual Machine) 运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。 JDK一般有三种版本: SE (J2SE) ,standard edition,标准版,是我们通常用的一个版本EE (J2EE) ,enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序,ME (J2ME) ,micro edtion,主要用于移动设备、嵌入式设备上的java应用程序Java开发工具 (JDK) 是许多Java专家最初使用的开发环境。尽管许多编程人员已经使用第三方的开发工具,但JDK仍被当作Java开发的重要工具。JDK由一个标准类库和一组建立,测试及建立文档的Java实用程序组成。其核心Java API是一些预定义的类库,开发人员需要用这些类来访问Java语言的功能。Java API包括一些重要的语言结构以及基本图形,网络和文件I/O.一般来说,Java API的非I/O部分对于运行Java的所有平台是相同的,而I/O部分则仅在通用Java环境中实现。 作为JDK实用程序, 工具库中有七种主要程序。 Javac, Java, appletviewer, Javadoc, Jdb, Javah, Javap; [[jdk-tool#jdk tool java tool jvm tool]] JRE JRE (Java Runtime Environment,Java运行环境) ,运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。是Sun的产品,包括两部分: JavaRuntimeEnvironment和JavaPlug-inJavaRuntimeEnvironment (JRE) 是可以在其上运行、测试和传输应用程序的Java平台。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具——编译器、调试器和其它工具。JRE需要辅助软件 ——JavaPlug-in——以便在浏览器中运行applet.J2RE是Java2 Runtime Environment,即Java运行环境,有时简称JRE.如果你只需要运行Java程序或Applet,下载并安装它即可。如果你要自行开发 Java软件,请下载JDK.在JDK中附带有JRE.注意由于Microsoft对Java的支持不完全,请不要使用IE自带的虚拟机来运行 Applet,务必安装一个JRE或JDK.

2013-10-20 · 1 min · 62 words · -

管程, monitor

管程, monitor 管程, 监视器, Moniter Java程序设计语言中,每个对象都可以作为一个管程。需要互斥使用的方法必须明确标示关键字 synchronized . 代码块也可以标示关键字synchronized. 不使用明确的条件变量, Java的这种管程在入口队列之外,使用单独的条件等待队列. 所有等待的线程进入这个队列, 所有的notify与notify all操作也施加于这个队列。这种方法已经被其它程序设计语言使用,如C#. Java中的同步方法与其他经典管程有本质差别: Java没有内嵌的条件变量。反之,Java提供了两个过程wait和notify ,分别与sleep和wakeup等价, 不过,当它们在同步方法中使用时,它们不受竞争条件约束。理论上,方法wait可以被中断,它本身就是与中断有关的代码。Java需要显式表示异常处理。 在JAVA中是如何实现管程? 在Java虚拟机中,每个对象和类在逻辑上与管程相关联。为了实现管程的互斥能力,一个锁(有时也称为一个互斥锁)关联每个对象和类。这就是所谓操作系统书籍上的信号量(semaphore),互斥锁是一个二进制信号量。 如果一个线程拥有一些数据的锁,那么没有其他线程可以获取这个锁,直到拥有锁的线程释放它。当我们做多线程编程时,如果任何时候都需要编写一个信号量,这将是不方便。幸运的是,我们并不需要,因为JVM自动为我们实现了。 声明一个管程区域,这意味着数据不能被超过一个线程访问,java提供同步代码块和同步方法。一旦代码被嵌入synchronized关键字,它就是一个管程区域。该锁在后台通过JVM自动实现。 3.在JAVA的同步代码中,哪一部分是管程? 我们知道每个对象/类都关联一个管程。我认为更好的说法应该是每个对象都有一个管程,因为每个对象可以有它自己的临界区,并能够监控线程顺序。 为了使不同的线程协作,JAVA为提供了wait()和notify()来挂起线程和唤醒另外一个等待的线程。此外,还有其他3个方法: wait(long timeout, int nanos) wait(long timeout) notified by other threads or notified by timeout. notify(all) 这些方法只能在同步代码块或同步方法中调用。因为所有的这些方法都需要线程持有对象的锁,所以只能通过同步来实现。 管程 (英语: Moniters,也称为监视器) 是一种程序结构,结构内的多个子程序 (对象或模块) 形成的多个工作线程互斥访问共享资源。 这些共享资源一般是硬件设备或一群变量。管程实现了在一个时间点,最多只有一个线程在执行管程的某个子程序。 与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程实现很大程度上简化了程序设计。 管程提供了一种机制,线程可以临时放弃互斥访问,等待某些条件得到满足后,重新获得执行权恢复它的互斥访问。 一个管程包含: 多个彼此可以交互并共用资源的线程 多个与资源使用有关的变量 一个互斥锁 一个用来避免竞态条件的不变量 一个管程的程序在运行一个线程前会先取得互斥锁,直到完成线程或是线程等待某个条件被满足才会放弃互斥锁。 若每个执行中的线程在放弃互斥锁之前都能保证不变量成立,则所有线程皆不会导致竞态条件成立。 当一个线程执行管程中的一个子程序时,称为占用(occupy)该管程. 管程的实现确保了在一个时间点,最多只有一个线程占用了该管程。这是管程的互斥锁访问性质。 当线程要调用一个定义在管程中的子程序时,必须等到已经没有其它线程在执行管程中的某个子程序。 在管程的简单实现中,编译器为每个管程对象自动加入一把私有的互斥锁。该互斥锁初始状态为解锁, 在管程的每个公共子程序的入口给该互斥锁加锁,在管程的每个公共子程序的出口给该互斥锁解锁。 条件变量(Condition Variable) 管程提供了一种实现互斥的简便途径,但这还不够。我们还需要一种办法使得线程在无法继续运行时被阻塞。 在生产者-消费者问题中,很容易将针对缓冲区满和缓冲区空的测试放到管程过程中,但是生产者在发现缓冲区满的时候如何阻塞呢? 解决的方法是引入条件变量 (condition variables) 以及相关的两个操作: wait和signal。 ...

2012-11-15 · 2 min · 274 words · -

Java

Java Java,是由_Sun Microsystems_公司于1995年5月推出的Java程序设计语言和Java平台的总称。用Java实现的HotJava浏览器 (支持Java applet) 显示了Java的魅力: 跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet。 1995年5月23日,Java语言诞生 1996年1月,第一个JDK-JDK1.0诞生 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术 1996年9月,约8.3万个网页应用了JAVA技术来制作 1997年2月18日,JDK1.1发布 1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录 1997年9月,JavaDeveloperConnection社区成员超过十万 1998年2月,JDK1.1被下载超过2,000,000次 1998年12月8日,JAVA2企业平台J2EE发布 1999年6月,SUN公司发布Java的三个版本: 标准版 (J2SE) 、企业版 (J2EE) 和微型版 (J2ME) 2000年5月8日,JDK1.3发布 2000年5月29日,JDK1.4发布 2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机 2001年9月24日,J2EE1.3发布 2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升 2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0 2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字"2": J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME 2006年12月,SUN公司发布JRE6.0 2009年12月,SUN公司发布Java EE 6 2010年11月,由于Oracle公司对于Java社区的不友善,因此Apache扬言将退出JCP[7] 2011年7月28日,Oracle公司发布Java SE 7 一、算术运算符: 单目: + (取正) - (取负) ++ (自增1) - - (自减1) 双目: + - * / % (取余) 三目: a>b?true:false 说明: 当a大于b的时候,为true (也就是冒号之前的值) ,否则为false;这整个运算符包括一个关系运算符 (可以是">""<""!=“等等) ,一个”?",一个": “,冒号前后需要有两个表达式或者是值或者是对象。 ...

2012-09-26 · 1 min · 189 words · -

java enum/枚举

java enum/枚举 Java 5.0 引入了枚举类型,语法参见 JLS 8.9 枚举比较 // 枚举可以用 "==" 和 equals 比较 GameEnum s1 = GameEnum.BIG; GameEnum s2 = GameEnum.BIG; GameEnum ss1 = GameEnum.SMALL; System.out.println("s1 == s2: " + (s1 == s2)); //true System.out.println("s1.equals(s2): " + (s1.equals(s2))); //true System.out.println("s1 == ss1: " + (s1 == ss1)); //false System.out.println("s1.equals(ss1): " + (s1.equals(ss1))); //false // 字符串 > 枚举 Blah val = Blah.valueOf("A") package com.ljq.test; 普通枚举 定义一个功能简单的枚举类型,跟定义一个简单的类很相似,例如 跟类定义一样,枚举类型可以单独放在一个文件里,当一个枚举类型用public修饰时,它对其他包可见,否则只对同一个包中的类可见,这和类定义是一样的。 标识符 MONDAY, TUESDAY等就称为枚举常量 (enumeration constants) 每一个枚举常量被隐式的声明成Day的一个public、static成员,而且其类型为Day,亦就是说这些常量是self-typed的 ...

2012-09-22 · 8 min · 1622 words · -

java线程安全

java线程安全 什么叫线程安全?这个首先要明确。线程安全就是说多线程访问同一代码,不会产生不确定的结果。 java的内存模型,java的线程同步机制。特别是内存模型,java的线程同步机制很大程度上都是基于内 存模型而设定的。 浅谈java内存模型 不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的。其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结java的内存模型,要解决两个主要的问题: 可见性和有序性。我们都知道计算机有高速缓存的存在,处理器并不是每次处理数据都是取内存的。JVM定义了自己的内存模型,屏蔽了底层平台内存管理细节,对于java开发人员,要清楚在jvm内存模型的基础上,如果解决多线程的可见性和有序性。 那么,何谓可见性? 多个线程之间是不能互相传递数据通信的,它们之间的沟通只能通过共享变量来进行。Java内存模型 (JMM) 规定了jvm有主内存,主内存是多个线程共享的。当new一个对象的时候,也是被分配在主内存中,每个线程都有自己的工作内存,工作内存存储了主存的某些对象的副本,当然线程的工作内存大小是有限制的。当线程操作某个对象时,执行顺序如下: (1) 从主存复制变量到当前工作内存 (read and load) (2) 执行代码,改变共享变量值 (use and assign) (3) 用工作内存数据刷新主存相关内容 (store and write) JVM规范定义了线程对主存的操作指 令: read,load,use,assign,store,write。当一个共享变量在多个线程的工作内存中都有副本时,如果一个线程修改了这个共享变量,那么其他线程应该能够看到这个被修改后的值,这就是多线程的可见性问题。 那么,什么是有序性呢?线程在引用变量时不能直接从主内存中引用,如果线程工作内存中没有该变量,则会从主内存中拷贝一个副本到工作内存中,这个过程为read-load,完成后线程会引用该副本。当同一线程再度引用该字段时,有可能重新从主存中获取变量副本(read-load-use),也有可能直接引用原来的副本 (use),也就是说 read,load,use顺序可以由JVM实现系统决定。 线程不能直接为主存中的字段赋值,它会将值指定给工作内存中的变量副本(assign),完成后这个变量副本会同步到主存储区(store- write),至于何时同步过去,根据JVM实现系统决定.有该字段,则会从主内存中将该字段赋值到工作内存中,这个过程为read-load,完成后线程会引用该变量副本,当同一线程多次重复对字段赋值时,比如: for(int i=0;i<10;i++) a++; 线程有可能只对工作内存中的副本进行赋值,只到最后一次赋值后才同步到主存储区,所以assign,store,write顺序可以由JVM实现系统决定。假设有一个共享变量x,线程a执行x=x+1。从上面的描述中可以知道x=x+1并不是一个原子操作,它的执行过程如下: 1 从主存中读取变量x副本到工作内存 2 给x加1 3 将x加1后的值写回主存 如果另外一个线程b执行x=x-1,执行过程如下: 1 从主存中读取变量x副本到工作内存 2 给x减1 3 将x减1后的值写回主存 那么显然,最终的x的值是不可靠的。假设x现在为10,线程a加1,线程b减1,从表面上看,似乎最终x还是为10,但是多线程情况下会有这种情况发生: 1: 线程a从主存读取x副本到工作内存,工作内存中x值为10 2: 线程b从主存读取x副本到工作内存,工作内存中x值为10 3: 线程a将工作内存中x加1,工作内存中x值为11 4: 线程a将x提交主存中,主存中x为11 5: 线程b将工作内存中x值减1,工作内存中x值为9 6: 线程b将x提交到中主存中,主存中x为9 同样,x有可能为11,如果x是一个银行账户,线程a存款,线程b扣款,显然这样是有严重问题的,要解决这个问题,必须保证线程a和线程b是有序执行的, 并且每个线程执行的加1或减1是一个原子操作。看看下面代码: public class Account { private int balance; ...

2012-09-21 · 3 min · 587 words · -

运行时异常/一般异常

运行时异常/一般异常 http://blog.csdn.net/yakihappy/article/details/3979883 Throwable是所有Java程序中错误处理的父类,有两种资类: Error和Exception。 Error: 表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。 Exception: 表示可恢复的例外,这是可捕捉到的。 Java提供了两类主要的异常:runtime exception和checked exception。 checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。 但是另外一种异常: runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如: 我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。 出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。 如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。 异常处理的目标之一就是为了把程序从异常中恢复出来。

2012-09-20 · 1 min · 20 words · -

JAVA String, StringBuffer, StringBuilder

JAVA String, StringBuffer, StringBuilder JAVA平台提供了两个类: String 和 StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而StringBuffer类提供的字符串允许进行修改。当你知道字符数据要改变的时候你就可以使用 StringBuffer。典型地,你可以使用 StringBuffers 来动态构造字符数据。 在java中与字符串操作相关的类 Character 是进行单个字符操作的, String 字符串常量 对一串字符进行操作。不可变类。 StringBuffer 也是对一串字符进行操作,但是可变类。字符串变量 (线程安全) StringBuilder 字符串变量 (非线程安全) String String是对象不是原始类型, 为不可变对象,一旦被创建,就不能修改它的值,对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去. String 是final类,即不能被继承. 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的: String S1 = “This is only a” + " simple" + " test"; StringBuffer Sb = new StringBuilder(“This is only a”).append(" simple").append(" test"); 你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个 String S1 = “This is only a” + " simple" + “test”; 其实就是: String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如: String S2 = “This is only a”; String S3 = " simple"; String S4 = " test"; String S1 = S2 +S3 + S4; 这时候 JVM 会规规矩矩的按照原来的方式去做 ...

2012-09-20 · 2 min · 402 words · -

java basic

java basic JDK 和 JRE 的区别 JRE:Java Runtime Environment 的简称,java 运行时环境,为 java 的运行提供了所需环境。 Java 虚拟机 jfr JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。 包含了JRE 编译器: javac 其他的工具: JavaDoc,Java调试器(jdb), jcmd, jstat, jmap JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。 http://www.wiloon.com/jdk-jre == vs equals == 对于基本类型和引用类型 == 的作用效果是不同的 基本类型:比较的是值是否相同; 引用类型:比较的是引用是否相同; String x = "string"; String y = "string"; String z = new String("string"); System.out.println(x==y); // true System.out.println(x==z); // false System.out.println(x.equals(y)); // true System.out.println(x.equals(z)); // true 代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。 ...

2012-09-20 · 4 min · 720 words · -

Java 反编译

Java 反编译 Java Decompiler “Java Decompiler”, 由 Pavel Kouznetsov开发,目前最新版本为0.2.5. 它由 C++开发,并且官方可以下载windows、linux和苹果Mac Os三个平台的可执行程序。 http://jd.benow.ca/ http://www.oschina.net/p/java+decompiler DJ Java Decompiler(不免费) DJ Java Decompiler 是个反编译的工具,可以将编译过的 CLASS 文件编译还原成为 Java 原始文件,并且不需要额外安装 JVM (Java Virtual Machine) 或是JDK 的工具模组即可使用。不单如此,它也兼具有 Java 程序编辑工具的角色,提供一些辅助功能便于程序撰写与修改。 DJ Java Decompiler 在 Windows 95、Windows 98、Windows 2000、Windows XP、Windows 2003、Windows Vista、 Windows 7等多种平台上均可以运行的 Java 反编译器和汇编器。DJ Java Decompiler 能够反复编译复杂的 Java 小程序和二进制文件,生产出准确的源代码。它不仅是 Java 反编译器和汇编器,也是一个功能齐全的使用有着着色语法的图形用户界面的 Java 编辑器。 这款软件十分适合用来学习编程,而且它能够让用户保存、打印、编辑和编译生成的 Java 代码。 另外,DJ Java Decompiler 是一个独立的 windows 应用程序,它不要求安装Java,所以运行使用相当方便,大家不妨试一下。 个人觉得比较好的功能有: 可以直接打开jar 档, 查看jar 包里原文件 ...

2012-08-24 · 1 min · 75 words · -