步步理解 JAVA 泛型编程(三)

前面介绍的无论是泛型类还是泛型方法,基本上都是把定义的类型参数作为一个整体来操作,放到数组或取出来,顶多就是调用了一下 hashCode() 方法,因为这是 Java 的根对象拥有的方法。比如说一个泛型数组,要得到其中的最小元素:

阅读全文 >>

步步理解 JAVA 泛型编程(二)

前面讲了泛型类的定义,你也可以在一个普通类中单单定义一个泛型方法。也就是说类能够带个类型参数,方法也可以带类型参数的。还是来看个例子(包括如何应用),一个获得数组中间元素的方法,因为数组中存储元素的类型是不定的,所以把该方法定义成泛型的。

阅读全文 >>

步步理解 JAVA 泛型编程(一)

JDK 1.5 相对于 JDK 1.4 来说变化最大的部分就是泛型,甚至可以说自 Java 1.0 发布以来也是最大的一次语言变化,因为要涉及到编译器的大改动。很早的时候大家对泛型的呼声很大,正如 C++ 的模板,C# 的泛型确实是个值得借鉴的好特性。JDK1.5 这前,很多人对于泛型是急不可耐,在 JDK1.4 下搭配一个外挂的 Generic Java 编译器,通老实 -Xbootclasspath、-bootclasspath 同样能让你在 1.4 的 JDK 上使用泛型:

javac -J-Xbootclasspath/p:JSR14HOME\gjcrt.jar -bootclasspath JSR14HOME\collect.jar;JDK141HOME\jre\lib\rt.jar -source 1.5 FileName.java
java -Xbootclasspath/p:JSR14HOME\gjc-rt.jar FileName 阅读全文 >>

JMS 使用 ActiveMQ 传送文件

这里使用的 MQ 中间件是开源的 ActiveMQ,我们没有采用 BytesMessage 来按字节传送文件,而是 ActiveMQ 为我们提供了 org.apache.activemq.BlobMessage,可以用它来传送大对象。org.apache.activemq.ActiveMQSession 中有以下几个创建 BlobMessage 对象的方法:

createBlobMessage(URL url)

createBlobMessage(URL url, boolean deletedByBroker)

createBlobMessage(File file)

createBlobMessage(InputStream in)

接收到 BlobMessage 消息后,可以调用其 getInputStream() 方法获得数据,然后写成磁盘文件,文件名、文件大小等可通过 Message 的 getXxxProperty("Property.Name") 取的。 阅读全文 >>

Java 线程同步,对象锁与互斥规则

在前面一篇 是同步方法还是 synchronized 代码?-- 详解多线程同步规则 其实已清楚讲述了这里想要是解的话题,只是之前的长篇大论,没个重点,读来实在会让人受累,故在此单列一专题,假以图示,也为自己加深对同步锁的理解。道中人觉得哪里说得有出入或有更妙的理解方式,尽管拍过来。

记得我初识多线程时,就是很简单化的去理解了同步:说到要同步,无外乎就是给方法加 synchronized 关键字,或者给代码块加上 synchronized(this) 括起来[注:jdk 1.5 后可用 Lock 来同步代码],以为这样就万事大吉,就能保证一个线程执行时,另一个线程就进不来。其实不尽然,因为静态同步方法与非静态同步方法是有区别的,而 synchronized(this) 括号中是用 this 还是要用别的对象,也是有讲究的,这些问题可以阅读前一篇:是同步方法还是 synchronized 代码?-- 详解多线程同步规则阅读全文 >>

SLF4J 的几种实际应用模式--之三:JCL-Over-SLF4J+SLF4J

我们前面已经讲过了 SLF4J 的两种用法:SLF4J+Log4J  和 SLF4J+Logback,那是在比较理想的情况下,所用组件只使用了 SLF4J 这一种统一日志框架的时候。可是 JCL 一直影响深远,SLF4J 渐入佳境的时个,在你的项目中很可能所用的组件,它们分别用了 JCL 和 SLF4J 两种组件。比如说在项目中用了 Hibernate 3.5 和 Struts,或其他 Apache 的一些开源组件,你大约也不想用了 SLF4J 的组件日志信息输出到 A 处,用了 JCL 的组件日志输出到 B 处,那你自己写的代码中的日志信息该往哪儿写呢?

中国人一直都愿追求大一统,不喜欢城邦制的便于分而治之。但说到日志输出还是得统一到单一通道中来,一方面多个通道浪费资源,另方面也便于配置和管理。那么既然 SLF4J 是趋势,当 SLF4J 和 JCL 被丢到一个坛子里,首先会让 SLF4J 为主,JCL 为辅,也就是要把 JCL 桥接到 SLF4J 上来,通过 SLF4J 统一输出日志信息。于是也就是这篇要介绍的 SLF4J 使用模式:JCL-Over-SLF4J+SLF4J。 阅读全文 >>

SLF4J 的几种实际应用模式--之二:SLF4J+Logback

前面讲的 SLF4J 的用法之一是 SLF4J+Log4J,而这里要推出的组合是 SLF4J+LogBack。不用 Log4J?难道还有比 Log4J 更好的日志实现吗?是的,答案就是 LogBack。假如你知道 LogBack 和 Log4J 是同出一位大师之手,你就不会觉得惊讶了。LogBack 对 Log4J 进行了增强,并投入了 SLF4J 的怀抱,它还被作者认定为 Log4J 的继任者。

为什么叫做 Logback,我就不知道了,反正不要叫做 Brokeback 就行。这里是推崇用 Logback 替代 Log4J 的十几个理由:Reasons to prefer logback over log4j,说的大至是更快;好测试;与 SLF4J 关系紧;文档丰富;能自动加载配置文件;多个 JVM 写一个日志文件,或其他 I/O 错误时不影响程序执行;配置文件中加入条件控制;强大的日志过滤;更强的日志切分功能;自动压缩、删除日志文件;异常栈中更多的数据信息。 阅读全文 >>

SLF4J 的几种实际应用模式--之一:SLF4J+Log4J

SLF4J(Simple Logging Facade for Java) 是一个通用的日志框架,不能何以谓之 Facade(门面),所扮眼的角色相当于 Jakarta Commons Logging。就像 JCL 需要底层的日志实现,如 Log4J、java.util.logging、Simple Logger 等来完成具体的信息输出,事实上基本总是 JCL+Log4J 那么一个绝配。SLF4J 的原旨也是能支持多种下层日志框架实现,但最好的日志实现仍然是 Log4J,所以本篇讲述 SLF4J 的第一种用法 SLF4J+Log4J。

需要的配置文件和组件包,下面三个 jar 文件和一个 properties 文件都是要放在项目的 ClassPath 上。

1. slf4j-api-1.5.11.jar
2. slf4j-log4j12-1.5.11.jar
3. log4j-1.2.15.jar
4. log4j.properties(也可以是 log4j.xml,本例中用 log4j.propertes) 阅读全文 >>

Java SE6 中的新功能特性简介

1. String 新增了 isEmpty() 方法
     对于 String 不需要用 str.length() !=0  来判断

2. Arrays 新增 copyOf() 从已知数组中拷贝直接返回一个新的数组
     不再需要,先准备一个数组,然后用 System.arrayCopy() 来从旧数组往新数组中拷贝数据

3. Arrays 还新增了  copyOfRange() ,binarySearch(arr, fromIndex, toIndex, des) 方法,可在一个范围内查找。

4. 可以用 Calendar 实例的 getDisplayNames() 和 getDisplayName() 获得区域化的日期格式显示

5. System上新增 console() 获得 Console 实例,可用其的 printf()、readLine()、readPassword()、reader()、writer() 等方法,如 阅读全文 >>

新一代通用日志框架 SLF4J 用户指南


SLF4J 用户指南

Simple Logging Facade for Java(简单日志门面--门面一词总觉有些别扭,还没找到更好的词),简称 SLF4J,是作为各种日志框架的简单门面或者抽象的。比如,那些日志框架有 java.util.logging, log4j 和 logback 等,SLF4j 允许终端用户在部署的时候插入自己想要的日志框架。

Hello World

依照编程的传统,这个例子描绘了简单的方式来使用 SLF4j 输出 "Hello world"。它从获得一个名为 "HelloWorld" 的 logger 开始。接着使用这个 logger 输出 "Hello World" 日志消息。 阅读全文 >>