﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-刘文涛-随笔分类-jar包学习</title><link>http://www.blogjava.net/liuwentao253/category/18206.html</link><description>SPRING,设计模式,UML,Oracle</description><language>zh-cn</language><lastBuildDate>Tue, 30 Oct 2007 03:39:23 GMT</lastBuildDate><pubDate>Tue, 30 Oct 2007 03:39:23 GMT</pubDate><ttl>60</ttl><item><title>org.apache.commons.lang.math </title><link>http://www.blogjava.net/liuwentao253/archive/2007/08/21/138355.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Tue, 21 Aug 2007 05:46:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/08/21/138355.html</guid><description><![CDATA[<p>在Jakarta Commons中，专门处理数学计算的类分别可以在两个地方找到：一是Commons Lang的org.apache.commons.lang.math包中，二是在Commons Math这个单独的子项目中。由于后者主要是处理复数、矩阵等，相对使用比较少，在我的笔记中就只简单讲讲Commons Lang中的math包。对后者感兴趣的可以看看</p>
<p><a href="http://jakarta.apache.org/commons/math/">http://jakarta.apache.org/commons/math/</a></p>
<p>&nbsp;</p>
<p>org.apache.commons.lang.math包中共有10个类，这些类可以归纳成四组：</p>
<p>1- 处理分数的Fraction类；</p>
<p>2- 处理数值的NumberUtils类；</p>
<p>3- 处理数值范围的Range、NumberRange、IntRange、LongRange、FloatRange、DoubleRange类；</p>
<p>4- 处理随机数的JVMRandom和RandomUtils类。</p>
<p>&nbsp;</p>
<p>下面我举个例子分别说明上述四组的使用方法：</p>
<p>&nbsp;</p>
<p>package sean.study.jakarta.commons.lang;</p>
<p>&nbsp;</p>
<p>import org.apache.commons.lang.ArrayUtils;</p>
<p>import org.apache.commons.lang.BooleanUtils;</p>
<p>import org.apache.commons.lang.StringUtils;</p>
<p>import org.apache.commons.lang.math.DoubleRange;</p>
<p>import org.apache.commons.lang.math.Fraction;</p>
<p>import org.apache.commons.lang.math.NumberUtils;</p>
<p>import org.apache.commons.lang.math.RandomUtils;</p>
<p>import org.apache.commons.lang.math.Range;</p>
<p>&nbsp;</p>
<p>public class LangMathUsage {</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; demoFraction();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; demoNumberUtils();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; demoNumberRange();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; demoRandomUtils();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; public static void demoFraction() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(StringUtils.center(" demoFraction ", 30, "="));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fraction myFraction = Fraction.getFraction(144, 90);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Fraction myFraction = Fraction.getFraction("1 54/90");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("144/90 as fraction: " + myFraction);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("144/90 to proper: " + myFraction.toProperString());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("144/90 as double: " + myFraction.doubleValue());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("144/90 reduced: " + myFraction.reduce());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("144/90 reduced proper: "</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + myFraction.reduce().toProperString());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; public static void demoNumberUtils() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(StringUtils.center(" demoNumberUtils ", 30, "="));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Is 0x3F a number? "</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + StringUtils.capitalize(BooleanUtils.toStringYesNo(NumberUtils</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .isNumber("0x3F"))) + ".");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double[] array = { 1.0, 3.4, 0.8, 7.1, 4.6 };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double max = NumberUtils.max(array);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double min = NumberUtils.min(array);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String arrayStr = ArrayUtils.toString(array);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Max of " + arrayStr + " is: " + max);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Min of " + arrayStr + " is: " + min);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; public static void demoNumberRange() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(StringUtils.center(" demoNumberRange ", 30, "="));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Range normalScoreRange = new DoubleRange(90, 120);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double score1 = 102.5;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double score2 = 79.9;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Normal score range is: " + normalScoreRange);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Is "</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + score1</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + " a normal score? "</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + StringUtils</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .capitalize(BooleanUtils.toStringYesNo(normalScoreRange</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .containsDouble(score1))) + ".");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Is "</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + score2</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + " a normal score? "</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + StringUtils</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .capitalize(BooleanUtils.toStringYesNo(normalScoreRange</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .containsDouble(score2))) + ".");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; public static void demoRandomUtils() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(StringUtils.center(" demoRandomUtils ", 30, "="));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 5; i++) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(RandomUtils.nextInt(100));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>}</p>
<p>&nbsp;</p>
<p>以下是运行结果：</p>
<p>&nbsp;</p>
<p>======== demoFraction ========</p>
<p>144/90 as fraction: 144/90</p>
<p>144/90 to proper: 1 54/90</p>
<p>144/90 as double: 1.6</p>
<p>144/90 reduced: 8/5</p>
<p>144/90 reduced proper: 1 3/5</p>
<p>&nbsp;</p>
<p>====== demoNumberUtils =======</p>
<p>Is 0x3F a number? Yes.</p>
<p>Max of {1.0,3.4,0.8,7.1,4.6} is: 7.1</p>
<p>Min of {1.0,3.4,0.8,7.1,4.6} is: 0.8</p>
<p>&nbsp;</p>
<p>====== demoNumberRange =======</p>
<p>Normal score range is: Range[90.0,120.0]</p>
<p>Is 102.5 a normal score? Yes.</p>
<p>Is 79.9 a normal score? No.</p>
<p>&nbsp;</p>
<p>====== demoRandomUtils =======</p>
<p>75</p>
<p>63</p>
<p>40</p>
<p>21</p>
<p>92</p>
<p>&nbsp;</p>
<p>以上就是Commons Lang的math包通常的用法。提一下NumberUtils.inNumber(String)方法，它会正确判断出给定的字符串是否是合法的数值，而我在前面的笔记中提到的StringUtils.isNumeric(String)只能判断一个字符串是否是由纯数字字符组成。Commons Lang的math包的各个类都还有很多实用的方法，远不止我在例子中用到的这些，如果你感兴趣，参照一下Commons Lang的Javadoc吧。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/138355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-08-21 13:46 <a href="http://www.blogjava.net/liuwentao253/archive/2007/08/21/138355.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>commons.lang包中包含17个util类</title><link>http://www.blogjava.net/liuwentao253/archive/2007/08/21/138352.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Tue, 21 Aug 2007 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/08/21/138352.html</guid><description><![CDATA[<p>&nbsp;</p>
commons.lang包共包含了17个实用的类：&nbsp; <br>&nbsp;<br>ArrayUtils &#8211; 用于对数组的操作，如添加、查找、删除、子数组、倒序、元素类型转换等；<br>BitField &#8211; 用于操作位元，提供了一些方便而安全的方法；<br>BooleanUtils &#8211; 用于操作和转换boolean或者Boolean及相应的数组；<br>CharEncoding &#8211; 包含了Java环境支持的字符编码，提供是否支持某种编码的判断；<br>CharRange &#8211; 用于设定字符范围并做相应检查；<br>CharSet &#8211; 用于设定一组字符作为范围并做相应检查；<br>CharSetUtils &#8211; 用于操作CharSet；<br>CharUtils &#8211; 用于操作char值和Character对象；<br>ClassUtils &#8211; 用于对Java类的操作，不使用反射；<br>ObjectUtils &#8211; 用于操作Java对象，提供null安全的访问和其他一些功能；<br>RandomStringUtils &#8211; 用于生成随机的字符串；<br>SerializationUtils &#8211; 用于处理对象序列化，提供比一般Java序列化更高级的处理能力；<br>StringEscapeUtils &#8211; 用于正确处理转义字符，产生正确的Java、JavaScript、HTML、XML和SQL代码；<br>StringUtils &#8211; 处理String的核心类，提供了相当多的功能；<br>SystemUtils &#8211; 在java.lang.System基础上提供更方便的访问，如用户路径、Java版本、时区、操作系统等判断；<br>Validate &#8211; 提供验证的操作，有点类似assert断言；<br>WordUtils &#8211; 用于处理单词大小写、换行等。 <br><br><br>
<h5>管窥Commons</h5>
<p>我最感兴趣的是String Util类、StringUtils、RandomStringUtils和CharSetUtils。他们是String Taglib的主干部分，也是我花功夫最多的类。自然，我觉得它们非常有用，每天都在用他们。关于StringUtils类最值得关注的特性如下：</p>
<div></div>
<ul>
    <li>
    <div><strong>capitalise(String)</strong>：一个String大写化函数（这里保留了英式拼法），它不像大多数字符串库那样使用toUpperCase，而是恰当地使用了toTitleCase。</div>
    <li>
    <div><strong>join(Object[], String)</strong>：它把对象数组里每个对象的toString合并成带有指定定界符的单个String。所以join( , ";")的结果是"A;B;C"。Iterator也可以被连接。</div>
    <li>
    <div><strong>split(String, String)</strong>：它能分割带有定界符的文本。其功能没有StringTokenizer（它不能一次处理多组定界符）强大，但是能够很快、很容易地应用于很多场合。它是上一个合并方法的反向操作：split("A;B;C",";") =&gt; {"A", "B", "C"}。这个分割方法现在已经可以在 JDK 1.4的java.lang.String里找到了。</div>
    <li>
    <div><strong>reverseDelimitedString(String, String)</strong>：这是个很有趣的方法。它能以定界符为基础颠倒一段文本。所以：reverseDelimitedString("org.apache.commons")的结果就变成了"commons.apache.org."</div>
    <li>
    <div><strong>replace(String, String, String)</strong>：这个String替换方法常常是很让人期待的。JDK1.4能够使用正规表达式解决这个问题，但是StringUtils类所提供的基于String更简单的版本更常用。</div>
    </li>
</ul>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/138352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-08-21 13:41 <a href="http://www.blogjava.net/liuwentao253/archive/2007/08/21/138352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>合理利用StringUtils类中的方法</title><link>http://www.blogjava.net/liuwentao253/archive/2007/03/31/107624.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Sat, 31 Mar 2007 04:15:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/03/31/107624.html</guid><description><![CDATA[
		<p>标准的JAVA应用编程接口能够支持字符串操作，但是更多的时候，仅仅支持是不够的。Commons Lang的StringUtils包加入到类路径中。StringUtils类中有不计其数的有用的方法。 <br /> <br />如果你需要使一个字符串居中（在输出的时候），可以使用居中方法：<br />log(StringUtils.center("to be centered", 50, "*"));<br />// ******************to be centered****************** </p>
		<p>如果你需要重复的书写同一个数字，你可以这么写：</p>
		<p>log(StringUtils.leftPad("34", 8, "0"));<br />// 00000034<br />又或者你需要在一个数组中加入一个元素，你可以这么做：</p>
		<p>log(StringUtils.join(new String[]{"cat","dog","carrot","leaf","door"}, ":")</p>
		<p>// cat:dog:carrot:leaf:door </p>
		<p>如果你需要一个大写字母或者是需要一个字符串中的每个单词第一个字母大写，你可以这么做：</p>
		<p>log(StringUtils.capitaliseAllWords("a sentenced to be capitalised"));<br />// A Sentenced To Be Capitalised</p>
		<p>如果你需要计算一个字母在字符串中出现的个数，你可以使用countMatches方法：log(StringUtils.countMatches("Bethany plays with army men", "e"));<br />// 2 </p>
		<p>甚至还有计算两字符串之间的Levenshtein-Distance</p>
		<p>log(StringUtils.getLevenshteinDistance("David", "Jakob"));<br />// 4 </p>
		<p>尽管上面的例子有些鲜为人知，但是你可以从中了解一些它的用法。</p>
		<p>为了使用StringUtils，必须下载Commons Lang package当你浏览这个包的时候，记得了解一下这个包剩下的内容，你会发现这个包中的很多函数提供了强大的操作字符，数字，异常，甚至枚举类型的字符串的功能。<br /></p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/107624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-03-31 12:15 <a href="http://www.blogjava.net/liuwentao253/archive/2007/03/31/107624.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java下的Framework编写(反射,泛型,元数据,CGLib,AOP,IOC)</title><link>http://www.blogjava.net/liuwentao253/archive/2006/12/08/86251.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Fri, 08 Dec 2006 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/12/08/86251.html</guid><description><![CDATA[反射、Proxy和元数据是Java框架最强的三个特征。<br /><br />   Proxy可以看作是微型的AOP，的的确确提供了在继承和委托之外的第三个代码封装途径，只要有足够的想象力，可以做得非常好玩，Spring的源码里用Proxy就用得很随便，看得我非常眼红。<br /><br />   选择<font color="#000080">cglib (Code Generation Library)</font>，是因为AOP框架一般比较大，丁点事情都要在XML文件里配置一番，所以要到Component级的事情才好麻烦AspectJ它们出手，平时的小代码封装，拿个cgilb/proxy玩玩就够了。众所周知，jdk自带的动态proxy必须基于接口，所以就跟风hibernate，用一下cglib。    cglib的Enhancer说起来神奇，用起来一页纸不到就讲完了。<br /><br />    它的原理就是用Enhancer生成一个原有类的子类，并且设置好callback ， 则原有类的每个方法调用都会转成调用实现了MethodInterceptor接口的proxy的intercept() 函数：<br />     
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object <font color="#0000ff"><strong>intercept</strong></font>(Object o,Method method,Object[] args,MethodProxy proxy)</span></div>     <br />在intercept()函数里，你可以在执行<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">Object result</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">proxy.invokeSuper(o,args);</span></div><br />来执行原有函数，在执行前后加入自己的东西，改变它的参数，也可以瞒天过海，完全干别的。说白了，就是AOP中的around advice。 
<p>     另外，cglib除了Enhancer之外，还有BulkBean和Transform，都是Hibernate持久化的基础，但文档贫乏，一时还没去看怎么用。</p><p>    <strong><font size="2">1.AOP里讲了一百遍阿一百遍的log aspect在cglib是这样做的:</font></strong></p><pre><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_58_684_Open_Image" onclick="this.style.display='none'; Codehighlighter1_58_684_Open_Text.style.display='none'; Codehighlighter1_58_684_Closed_Image.style.display='inline'; Codehighlighter1_58_684_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_58_684_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_58_684_Closed_Text.style.display='none'; Codehighlighter1_58_684_Open_Image.style.display='inline'; Codehighlighter1_58_684_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #000000">   </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> LogDAOProxy </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> MethodInterceptor  </span><span id="Codehighlighter1_58_684_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_58_684_Open_Text"><span style="COLOR: #000000">{       <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Logger log</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Logger.getLogger(AOPInstrumenter.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);       <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Enhancer enhancer</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Enhancer();        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">返回DAO的子类    </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">       <br /><img id="Codehighlighter1_247_389_Open_Image" onclick="this.style.display='none'; Codehighlighter1_247_389_Open_Text.style.display='none'; Codehighlighter1_247_389_Closed_Image.style.display='inline'; Codehighlighter1_247_389_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_247_389_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_247_389_Closed_Text.style.display='none'; Codehighlighter1_247_389_Open_Image.style.display='inline'; Codehighlighter1_247_389_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />       </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object getDAO(Class clz) </span><span id="Codehighlighter1_247_389_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_247_389_Open_Text"><span style="COLOR: #000000">{           <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />           enhancer.setSuperclass(clz);           <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />           enhancer.setCallback(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);           <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />           </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> enhancer.create();      <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span></span><span style="COLOR: #000000">       <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">磨人的拦截方法      </span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_528_679_Open_Image" onclick="this.style.display='none'; Codehighlighter1_528_679_Open_Text.style.display='none'; Codehighlighter1_528_679_Closed_Image.style.display='inline'; Codehighlighter1_528_679_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_528_679_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_528_679_Closed_Text.style.display='none'; Codehighlighter1_528_679_Open_Image.style.display='inline'; Codehighlighter1_528_679_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">       </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Throwable      </span><span id="Codehighlighter1_528_679_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_528_679_Open_Text"><span style="COLOR: #000000">{          <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />           log.info(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">调用日志方法</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">method.getName());           <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />           Object result</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">proxy.invokeSuper(o,args);           <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />           </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> result;     <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />       }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />   }</span></span></div>    应用的代码:</pre><pre><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">    LogDAOProxy proxy </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> LogDAOProxy();    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    GoodsDAO  dao </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (GoodsDAO)proxy.getDAO(GoodsDAO.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    dao.insert(goods);</span></div></pre> <strong> 2<font size="2">.而我今天小试菜刀实现的是一个高级的Decorator模式:</font></strong><br />        上面的例子其实有点虚，因为DAO都是由Spring管理的，不能这么随便由enhancer create()出来。所以更实际采用Decorator模式，把方法实际扔给Spring管辖下的DAO去完成。但如果每个DAO, 每个方法的写Decorator函数会写死人的，所以用上cglib。注意黑体字的部分。<br /><pre>   public class LogDAOProxy implements MethodInterceptor<br />  {<br />       private Logger log=Logger.getLogger(AOPInstrumenter.class);<br />       private Object dao=null;<br />       private Enhancer enhancer=new Enhancer();<br /> <br />       //返回DAO的子类<br />       public Object getDAO(Class clz,Object dao)<br />       {<br />           this.dao = dao;<br />           enhancer.setSuperclass(clz);<br />           enhancer.setCallback(this);<br />           return enhancer.create();<br />       }<br /> <br />      //默认的拦截方法<br />      public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) throws Throwable<br />      {<br />           log.info('调用日志方法'+method.getName());<br />           Object result=proxy.invoke(dao, args);<br />           return result;<br />      }<br />}</pre><p>BTW. 有点遗憾, intercept函数里MethodProxy的Signature是固定的 , 即客户如果调用foo(String),你不可以用proxy.invoke偷换成foo(String,String);</p><img src ="http://www.blogjava.net/liuwentao253/aggbug/86251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-12-08 10:34 <a href="http://www.blogjava.net/liuwentao253/archive/2006/12/08/86251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>强大的CGlib</title><link>http://www.blogjava.net/liuwentao253/archive/2006/12/08/86246.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Fri, 08 Dec 2006 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/12/08/86246.html</guid><description><![CDATA[
		<p>问题引出 ：<br /><br />昨天晚上看了看cglib的实现，感觉真是强，直接生成class，直接用JVM的字节码来实现我们平时看到的语句，为了弄清这一点，我不得不把它生成的class写放一个文件中，再用DJ反编译，才对它的机制有了一个初步的理解。与JDK的PROXY机制相比，后者要求有接口才行，这也难怪HIBERNATE使用CGLIB了，理由很明显pojo不应该被强制实现某个接口。<br /><br /><br />Q  ：<br />我觉得POJO可以用JDK对po类（不需要接口）t通过反射来创建啊，为什么要用proxy呢？能解释一下吗？<br /><br />A ：<br />在使用Hiberate时，需要对我们的POJO对象，进行代码增强，也就是动态的生成代码，"插入"到POJO中，比如在Hiberante中，对象的延迟加载就是通过代码增强实现的，还有就是它的属性的读写也可以通过代码增强实现，按理来说可以避免反射的开销。同时，Hibernate结合使用了反射和CGLIB,我在BLOG的说法错了,抱谦，以上只是我的一些看法，好久没动这些东西，可能会有遗漏，一起研究:)<br /><br /><br /><br /></p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/86246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-12-08 10:08 <a href="http://www.blogjava.net/liuwentao253/archive/2006/12/08/86246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Commons-logging + Log4j  入门指南</title><link>http://www.blogjava.net/liuwentao253/archive/2006/08/03/61517.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Thu, 03 Aug 2006 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/08/03/61517.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一 ：为什么同时使用commons-logging和Log4j?为什么不仅使用其中之一？Commons-loggin的目的是为&#8220;所有的Java日志实现&#8221;提供一个统一的接口，它自身的日志功能平常弱（只有一个简单的SimpleLog?），所以一般不会单独使用它。Log4j的功能非常全面强大，是目前的首选。我发现几乎所有的Java开源项目都会用到Log4j，但我同时发现，...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuwentao253/archive/2006/08/03/61517.html'>阅读全文</a><img src ="http://www.blogjava.net/liuwentao253/aggbug/61517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-08-03 15:31 <a href="http://www.blogjava.net/liuwentao253/archive/2006/08/03/61517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4j基本使用方法</title><link>http://www.blogjava.net/liuwentao253/archive/2006/08/03/61484.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Thu, 03 Aug 2006 04:27:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/08/03/61484.html</guid><description><![CDATA[<p>Log4j由三个重要的组件构成：<br><br>1: 日志信息的优先级，<br>2: 日志信息的输出目的地，<br>3: 日志信息的输出格式。<br><br>日志信息的优先级从高到低有ERROR、WARN、INFO、DEBUG，分别用来指定这条日志信息的重要程度；<br>日志信息的输出目的地指定了日志将打印到<u>控制台</u>还是<u>文件</u>中；<br>日志信息的输出格式控制了日志信息的显示内容。</p>
<p>　　一、定义配置文件</p>
<p>　　其实您也可以完全不使用配置文件，而是在代码中配置Log4j环境。但是，使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式，一种是XML格式的文件，一种是<u>Java特性文件</u>（键=值）。下面我们介绍使用Java特性文件做为配置文件的方法：</p>
<p>　　1.配置根Logger，其语法为：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span> <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">log4j.rootLogger&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;[&nbsp;level&nbsp;]&nbsp;,&nbsp;appenderName,&nbsp;appenderName,&nbsp;&#8230;&nbsp;</span> </div>
<p>　　其中，level 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 </p>
<p>　　2.配置日志信息输出目的地Appender，其语法为：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span> <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">　　log4j.appender.appenderName&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;fully.qualified.name.of.appender.</span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008080">2</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　log4j.appender.appenderName.option1&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;value1&nbsp;<br></span><span style="COLOR: #008080">3</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　&#8230;&nbsp;<br></span><span style="COLOR: #008080">4</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　log4j.appender.appenderName.option&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;valueN&nbsp;</span> </div>
<p>　其中，Log4j提供的appender有以下几种：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span> <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">　　org.apache.log4j.ConsoleAppender（控制台），&nbsp;<br></span><span style="COLOR: #008080">2</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　org.apache.log4j.FileAppender（文件），&nbsp;<br></span><span style="COLOR: #008080">3</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br></span><span style="COLOR: #008080">4</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），&nbsp;<br></span><span style="COLOR: #008080">5</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）&nbsp;</span> </div>
<p>　3.配置日志信息的格式（布局），其语法为：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span> <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">　　log4j.appender.appenderName.layout&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;fully.qualified.name.of.layout.</span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008080">2</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　log4j.appender.appenderName.layout.option1&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;value1&nbsp;<br></span><span style="COLOR: #008080">3</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　&#8230;&nbsp;<br></span><span style="COLOR: #008080">4</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　log4j.appender.appenderName.layout.option&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;valueN&nbsp;</span> </div>
<p>&nbsp;&nbsp;&nbsp;其中，Log4j提供的layout有以下几种：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span> <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">　　org.apache.log4j.HTMLLayout（以HTML表格形式布局），&nbsp;<br></span><span style="COLOR: #008080">2</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　org.apache.log4j.PatternLayout（可以灵活地指定布局模式），&nbsp;<br></span><span style="COLOR: #008080">3</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），&nbsp;<br></span><span style="COLOR: #008080">4</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）&nbsp;</span> </div>
<p>&nbsp;&nbsp;&nbsp;Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下：<font style="BACKGROUND-COLOR: #ffffff" color=#000000></font></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span> <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #000000">%</span> <span style="COLOR: #000000">m&nbsp;输出代码中指定的消息<br></span><span style="COLOR: #008080">2</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　</span> <span style="COLOR: #000000">%</span> <span style="COLOR: #000000">p&nbsp;输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL&nbsp;<br></span><span style="COLOR: #008080">3</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　</span> <span style="COLOR: #000000">%</span> <span style="COLOR: #000000">r&nbsp;输出自应用启动到输出该log信息耗费的毫秒数&nbsp;<br></span><span style="COLOR: #008080">4</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　</span> <span style="COLOR: #000000">%</span> <span style="COLOR: #000000">c&nbsp;输出所属的类目，通常就是所在类的全名&nbsp;<br></span><span style="COLOR: #008080">5</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　</span> <span style="COLOR: #000000">%</span> <span style="COLOR: #000000">t&nbsp;输出产生该日志事件的线程名&nbsp;<br></span><span style="COLOR: #008080">6</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　</span> <span style="COLOR: #000000">%</span> <span style="COLOR: #000000">n&nbsp;输出一个回车换行符，Windows平台为&#8220;\r\n&#8221;，Unix平台为&#8220;\n&#8221;</span> </div>
<p><font size=1>&nbsp;　　%d 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921 <br>　　%l 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;举例：Testlog4.main(TestLog4.java:10)</font>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>　　二、在代码中使用Log4j </p>
<p>　　1.得到记录器</p>
<p>　　使用Log4j，第一步就是获取日志记录器，这个记录器将负责控制日志信息。其语法为：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span> <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000">&nbsp;Logger&nbsp;getLogger(&nbsp;String&nbsp;name)&nbsp;</span> </div>
<p>　　通过指定的名字获得记录器，如果必要的话，则为这个名字创建一个新的记录器。Name一般取本类的名字，比如：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span> <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000">&nbsp;Logger&nbsp;logger&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;Logger.getLogger&nbsp;(&nbsp;ServerWithLog4j.</span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">.getName&nbsp;()&nbsp;)</span> </div>
<p>　　2.读取配置文件 </p>
<p>　　当获得了日志记录器之后，第二步将配置Log4j环境，其语法为：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span> <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">　　BasicConfigurator.configure&nbsp;()：&nbsp;自动快速地使用缺省Log4j环境。<br></span><span style="COLOR: #008080">2</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　PropertyConfigurator.configure&nbsp;(&nbsp;String&nbsp;configFilename)&nbsp;：读取使用Java的特性文件编写的配置文件。<br></span><span style="COLOR: #008080">3</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　DOMConfigurator.configure&nbsp;(&nbsp;String&nbsp;filename&nbsp;)&nbsp;：读取XML形式的配置文件。</span> </div>
<p>　 3.插入记录信息（格式化日志信息）</p>
<p>　　当上两个必要步骤执行完毕，您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方，其语法如下：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span> <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">　　Logger.debug&nbsp;(&nbsp;Object&nbsp;message&nbsp;)&nbsp;;<br></span><span style="COLOR: #008080">2</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　Logger.info&nbsp;(&nbsp;Object&nbsp;message&nbsp;)&nbsp;;<br></span><span style="COLOR: #008080">3</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　Logger.warn&nbsp;(&nbsp;Object&nbsp;message&nbsp;)&nbsp;;<br></span><span style="COLOR: #008080">4</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>　　Logger.error&nbsp;(&nbsp;Object&nbsp;message&nbsp;)&nbsp;;</span> </div>
<p><br>&nbsp;</p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/61484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-08-03 12:27 <a href="http://www.blogjava.net/liuwentao253/archive/2006/08/03/61484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>