存档

文章标签 ‘JAVA’

Java参考书…持续补充中

2009年6月26日 admin 没有评论

初级读物

关于Java入门的书籍现在已经很少阅读了,下面的几本应该是之前读过的书中算不错的。

Java 2学习指南

虽然是一本SCJP的入门参考书,但语法讲解的很详细,做为新手打好基础是再好不过了。不过书有点老,应该不包含Java5中引入的新特性。

 

Java 5.0 Tiger 程序高手秘笈

专门介绍Java5的新特性,这些特性是在太重要了,足够一本书来描述。

中级读物

Java Persistence with Hibernate

Hibernate可以说是Java 最成功的ORM框架了,相关的书籍不少,但读了以后能让人知其所以然的书也就这一本了,原因很简单因为该书的作者之一就是Hibernate之父Gavin King.

Jakarta Commons Cookbook

Jakarta的common工具类不但可以提高你的生产效率,另外通过阅读源代码也能增进开发水平。

Java测试新技术TestNG和高级概念

单元测试已经是一门成熟的、并且普遍要求Java工程师掌握的工具,这本书介绍的是一个主流的单元测试框架TestNG的使用。

JUnit in Action 中文版

这本书介绍的是另一个Java单元测试框架Junit。

Java并发编程—设计原则与模式

本书的作者Doug Lea 包办了java.util.concurrent包中绝大多数的代码。如果想学习Java并发编程,这本书哪有不看的道理。

JAVA并发编程实践

获得16届Jolt大奖提名!最畅销图书!对并发、多线程的最佳阐述!Java并发编程图书中最值得一读的力作!让您沉着、踏实地迈进并发/多核时代!

高级读物

Effective Java中文版

非常棒的一本书,只是理解和掌握其中的内容需要实际的开发经验和对java语言的充分理解,所以把它评定到高级读物中。

 

Expert One-on-One J2EE Development without EJB中文版

Expert One-on-One J2EE Design and Development

搞Java的应该没有人不知道Spring的吧,这两本书是Spring 主要创始人Rod Johnson的作品,绝对值得一读。Expert One-on-One J2EE Development without EJB有中文版Expert One-on-One J2EE Design and Development的中文版式我读过的最差的中文翻译书之一,有好几个地方都在误导读者,对这本书有兴趣的同学还是读原文的比较实在。

 

To Be Continued

分类: JAVA, 学习 标签: ,

HotSpot Java常用工具介绍-jps(Java Virtual Machine Process Status Tool)

2009年6月25日 admin 没有评论
 

jps介绍

jps简单理解就是一个java版的ps,用来提供一些简单的jvm信息(进程ID,进程启动的路径,命令行参数等等)。jps的语法格式如下

jps [ options ] [ hostid ]
options-- 命令行参数 ,可选
-q 不输出classnameJARfilename
-m 输出main 方法的参数
-l  输出main class的类全名(包含package)或者jar的全路径
-v(小写) JVM输入参数
-V(大写)  输出通过标志文件传给JVM的参数
hostId是符合[protocol:][[//]hostname][:port][/servername]语法的字符串。
     protocol:协议,缺省时rmi
     hostname:主机名或IP地址,如果主机名忽略,就是localhost
     port: 端口
如果hostId为空,jps会列出locahost上的Jvm进程信息。
命令输出
lvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]
lvmId lvm进程ID
classname JVM启动类名
jarfilename  JVM启动的jar文件名
arg* 命令行参数
jvmarg jvm参数
 

参考资料

http://java.sun.com/javase/6/docs/technotes/tools/share/jps.html

分类: JAVA 标签: , ,

BeanUtils的copyProperties,populate实现方式分析以及容易引发的Bug

2009年6月22日 admin 没有评论

BeanUtils的copyProperties方法用来将orig中的成员变量的值复制给dest,即将已经存在的dest变为orig的副本。

public void copyProperties(Object dest, Object orig) {
.......
}

BeanUtils的populate方法用来将Map<Key,value>中的以值(String或String[])转换到目标bean对应的属性中,Map中的Key是目标bean的属性名。

public static void populate(Object bean, Map properties){
……
}

copyProperties同样支持了populate中的功能(注apache的javadoc中,明确指明这个方法是为解析http请求参数特别定义和使用的,在正常的使用中不推荐使用.他们推荐使用BeanUtils.copyProperties方法)。

BeanUtils.copyProperties和populate的实现方法是将源bean(也可以是Map)中的每个element在转换器(Converter)的帮助下,将转换的结果设置到目标bean对应的属性中。例如在HTTP 应用中需要从http request中抽取数据,http request传递过来的都是String 或是String数组类型的变量而目标类型可能是各种各样的,例如http request会有一个name=visitDate,value=’2009-05-13′的参数,而目标bean 的visitDate属性的类型是java.util.Date。
      BeanUtils的copyProperties和populate需要在转换器(converter)的配合下实现源和目标对象之间的数据类型的转换。在BeanUtils.copyProperties 的javadoc中说明的(Copy property values from the origin bean to the destination bean for all cases where the property names are the same—— 只要属性名相同就可以从源bean中拷贝值到目标bean中)这句话提供到功能就是要通过转换器才能实现的。在BeanUtils的 copyProperties和populate的使用过程中Converter是一个非常重要的概念,它提供了强大的扩展能力。

/****************************************************************/
public interface Converter {
public Object convert(Class type, Object value);
}
/****************************************************************/

convert方法的参数type是目标转换的类型,参数value是被转换的值,返回值就是转换以后的结果。当有需要自定义或扩展的Converter 的时候可以通过注册自定义的转换器来实现,例如Beanutil自带的DateConverter不支持String到java.util.Date的转换,通过扩展DateConverter就可以实现支持。需要特别注意的是Converter 是注册在classloader一级的,也就是说在一个class loader中同一时间只能有一个转换器起作用(BeanUtils的copyProperties和populate会依据目标bean属性的类型来决定启用那个转换器),我之前的项目中就有因为其他模块中在特定的时候会重新注册了某个类型的转换器,而新注册的转换器又没有支持我所需要的转换,从而导致在我的模块中出现NPE。 所以在使用BeanUtils.populate和copyProperties的时候要注意以下几点:

1. 只在系统初始化的时候注册一个转换器,而不要在某个功能的执行过程中注册转换器。
2. 转换器要能够支持项目各个模块的使用需求
3. 谨慎使用或者思考一下BeanUtils.populate和copyProperties是你想要的方法吗?

在我使用BeanUtils.populate的模块中本意是实现bean和Map的属性拷贝并不需要类型和值的转换。至于说为什么会使用 BeanUtils.populate完全是被它支持Map所误导,其实PropertyUtilsBean.copyProperties和 BeanUtils.copyProperties同样支持Map。就我想要实现的功能而言通过 PropertyUtilsBean.copyProperties方法能更好地满足。 PropertyUtilsBean.copyProperties方法不会有类型转换的逻辑,所以需要程序员自己保证目标和源Bean属性间的兼容性,也正因为如此PropertyUtilsBean.copyProperties的执行效率更高。

参考资料

BeanUtils.copyProperties与PropertyUtils.copyProperties用法及区别l

http://commons.apache.org/beanutils/v1.8.0/apidocs/org/apache/commons/beanutils/PropertyUtilsBean.html

http://commons.apache.org/beanutils/v1.8.0/apidocs/org/apache/commons/beanutils/BeanUtils.html

初用apache.commons.beanutils.BeanUtils

分类: JAVA 标签: