??xml version="1.0" encoding="utf-8" standalone="yes"?>极品粉嫩饱满一线天在线,91在线成人,97影院在线观看 http://www.aygfsteel.com/migrant/category/39444.html我们的失落…?/description>zh-cn Wed, 30 Jun 2010 06:57:51 GMT Wed, 30 Jun 2010 06:57:51 GMT 60 [转]java内部c?/title> http://www.aygfsteel.com/migrant/archive/2010/06/30/324878.htmlJ2EE学习W记 J2EE学习W记 Wed, 30 Jun 2010 06:26:00 GMT http://www.aygfsteel.com/migrant/archive/2010/06/30/324878.html http://www.aygfsteel.com/migrant/comments/324878.html http://www.aygfsteel.com/migrant/archive/2010/06/30/324878.html#Feedback 0 http://www.aygfsteel.com/migrant/comments/commentRss/324878.html http://www.aygfsteel.com/migrant/services/trackbacks/324878.html 阅读全文 ]]> [转]JAVA语言的反?Reflection)和内?Introspector) http://www.aygfsteel.com/migrant/archive/2010/02/04/311942.htmlJ2EE学习W记 J2EE学习W记 Thu, 04 Feb 2010 05:42:00 GMT http://www.aygfsteel.com/migrant/archive/2010/02/04/311942.html http://www.aygfsteel.com/migrant/comments/311942.html http://www.aygfsteel.com/migrant/archive/2010/02/04/311942.html#Feedback 1 http://www.aygfsteel.com/migrant/comments/commentRss/311942.html http://www.aygfsteel.com/migrant/services/trackbacks/311942.html 很多朋友在深入的接触JAVA语言后就会发现这样两个词Q反?Reflection)和内?Introspector)Q经常搞不清楚这到底是怎么回事Q在什么场合下应用以及如何使用Q今天把q二者放在一起介l,因ؓ它们二者是相辅相成的?/span>
反射
相对而言Q反比内省更容易理解一炏V用一句比较白的话来概括,反射是让你可以通过名称来得到对?c,属性,Ҏ)的技术。例如我们可以通过cd来生成一个类的实例;知道了方法名Q就可以调用q个ҎQ知道了属性名可以访问这个属性的倹{?/span>
q是写两个例子让大家更直观的了解反射的用方法:
// 通过cd来构造一个类的实?/span>
Class cls_str = Class.forName( " java.lang.String " );
// 上面q句很眼熟,因ؓ使用q?nbsp;JDBC 讉K数据库的人都用过 J
Object str = cls_str.newInstance();
// 相当?nbsp;String str = new String();
// 通过Ҏ名来调用一个方?/span>
String methodName = " length " ;
Method m = cls_str.getMethod(methodName, null );
System.out.println( " length is " + m.invoke(str, null ));
// 相当?nbsp;System.out.println(str.length());
上面的两个例子是比较常用Ҏ。看C面的例子有发问了:Z么要q么ȝ呢?本来一条语句就完成的事情干吗要整这么复杂?没错Q在上面的例子中实没有必要q么ȝ。不q你惛_q样一个应用程序,它支持动态的功能扩展Q也是说程序不重新启动但是可以自动加蝲新的功能Q这个功能用一个具体类来表C。首先我们必Mؓq些功能定义一个接口类Q然后我们要求所有扩展的功能cdd现我指定的接口,q个规定了应用程序和可扩展功能之间的接口规则Q但是怎么动态加载呢Q我们必让应用E序知道要扩展的功能cȝcdQ比如是test.Func1Q当我们把这个类?字符?告诉应用E序后,它就可以使用我们W一个例子的Ҏ来加载ƈ启用新的功能。这是cȝ反射Q请问你有别的选择吗?
内省
内省是Java语言对Beancd性、事件的一U缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设|新的倹{通过getName/setName来访问name属性,q就是默认的规则。Java中提供了一套API用来讉K某个属性的getter/setterҎQ通过q些API可以使你不需要了解这个规则(但你最好还是要搞清楚)Q这些API存放于包java.beans中?/span>
一般的做法是通过cIntrospector来获取某个对象的BeanInfo信息Q然后通过BeanInfo来获取属性的描述器(PropertyDescriptorQ,通过q个属性描q器可以获取某个属性对应的getter/setterҎQ然后我们就可以通过反射机制来调用这些方法。下面我们来看一个例子,q个例子把某个对象的所有属性名U和值都打印出来Q?br />
/**/ /*
* Created on 2004-6-29
*/
package demo;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
/** */ /**
* 内省演示例子
* @author liudong
*/
public class IntrospectorDemo {
String name;
public static void main(String[] args) throws Exception {
IntrospectorDemo demo = new IntrospectorDemo();
demo.setName( " Winter Lau " );
// 如果不想把父cȝ属性也列出来的话,
// ?nbsp;getBeanInfo 的第二个参数填写父类的信?/span>
BeanInfo bi = Introspector.getBeanInfo(demo.getClass(), Object. class );
PropertyDescriptor[] props = bi.getPropertyDescriptors();
for ( int i = 0 ;i < props.length;i ++ ) {
System.out.println(props[i].getName() + " = " +
props[i].getReadMethod().invoke(demo, null ));
}
}
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
}
Web开发框架Struts中的FormBean是通过内省机制来将表单中的数据映射到类的属性上Q因此要求FormBean的每个属性要有getter/setterҎ。但也ƈ不Lq样Q什么意思呢Q就是说对一个BeancLԌ我可以没有属性,但是只要有getter/setterҎ中的其中一个,那么Java的内省机制就会认为存在一个属性,比如cM有方法setMobileQ那么就认ؓ存在一个mobile的属性,q样可以方便我们把Beanc通过一个接口来定义而不用去关系具体实现Q不用去关系Bean中数据的存储。比如我们可以把所有的getter/setterҎ攑ֈ接口里定义,但是真正数据的存取则是在具体cMd玎ͼq样可提高系l的扩展性?/span>
ȝ
Java的反以及内省应用到E序设计中去可以大大的提供程序的化和可扩展性。有很多目都是采取q两U技术来实现其核心功能,例如我们前面提到的StrutsQ还有用于处理XML文g的Digester目Q其实应该说几乎所有的目都或多或的采用q两U技术。在实际应用q程中二者要怺l合方能发挥真正的智能化以及高度可扩展性?/span>
]]>[转]?join ?CountDownLatch 让主U程{待所有子U程完成 http://www.aygfsteel.com/migrant/archive/2010/01/26/310889.htmlJ2EE学习W记 J2EE学习W记 Tue, 26 Jan 2010 10:00:00 GMT http://www.aygfsteel.com/migrant/archive/2010/01/26/310889.html http://www.aygfsteel.com/migrant/comments/310889.html http://www.aygfsteel.com/migrant/archive/2010/01/26/310889.html#Feedback 0 http://www.aygfsteel.com/migrant/comments/commentRss/310889.html http://www.aygfsteel.com/migrant/services/trackbacks/310889.html 阅读全文 ]]> [转]java.math.BigDecimal的用?/title> http://www.aygfsteel.com/migrant/archive/2009/05/07/269368.htmlJ2EE学习W记 J2EE学习W记 Thu, 07 May 2009 03:33:00 GMT http://www.aygfsteel.com/migrant/archive/2009/05/07/269368.html http://www.aygfsteel.com/migrant/comments/269368.html http://www.aygfsteel.com/migrant/archive/2009/05/07/269368.html#Feedback 0 http://www.aygfsteel.com/migrant/comments/commentRss/269368.html http://www.aygfsteel.com/migrant/services/trackbacks/269368.html 问题的提出:
如果我们~译q行下面q个E序会看C么?
public class Test {
public static void main(String args[]) {
System.out.println( 0.05 + 0.01 );
System.out.println( 1.0 - 0.42 );
System.out.println( 4.015 * 100 );
System.out.println( 123.3 / 100 );
}
}
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
Java中的单QҎcdfloat和double不能够进行运。不光是JavaQ在其它很多~程语言中也有这L问题。在大多数情况下Q计的l果是准的Q但是多试几ơ(可以做一个@环)可以试出类g面的错误。现在终于理解ؓ什么要有BCD码了?br style="font-family: " />
q个问题相当严重Q如果你?.999999999999元,你的计算机是不会认ؓ你可以购?0元的商品的?br style="font-family: " />
在有的编E语a中提供了专门的货币类型来处理q种情况Q但是Java没有。现在让我们看看如何解决q个问题?br style="font-family: " />
四舍五入
我们的第一个反应是做四舍五入。MathcM的roundҎ不能讄保留几位数Q我们只能象q样Q保留两位)Q?br style="font-family: " />
public double round( double value) {
return Math.round(value * 100 ) / 100.0 ;
}
4.015*100=401.49999999999994
因此如果我们要做到精的四舍五入Q不能利用简单类型做Mq算
java.text.DecimalFormat也不能解册个问题:
System.out.println(new java.text.DecimalFormat("0.00").format(4.025));
输出?.02
BigDecimal
在《Effective Java》这本书中也提到q个原则Qfloat和double只能用来做科学计或者是工程计算Q在商业计算中我们要用java.math.BigDecimal。BigDecimal一共有4个够造方法,我们不关心用BigInteger来够造的那两个,那么q有两个Q它们是Q?br />
BigDecimal(double val)
Translates a double into a BigDecimal.
BigDecimal(String val)
Translates the String repre sentation of a BigDecimal into a BigDecimal.
上面的API要描q相当的明确Q而且通常情况下,上面的那一个用v来要方便一些。我们可能想都不惛_用上了,会有什么问题呢Q等到出了问题的时候,才发C面哪个够造方法的详细说明中有q么一D:
Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances nonwithstanding.
The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, it is generally recommended that the (String) constructor be used in preference to this one.
原来我们如果需要精计,非要用String来够造BigDecimal不可Q在《Effective Java》一书中的例子是用String来够造BigDecimal的,但是书上却没有强调这一点,q也许是一个小的p吧?br style="font-family: " />
解决Ҏ
现在我们已经可以解决q个问题了,原则是用BigDecimalq且一定要用String来够造?br style="font-family: " />
但是惛_一下吧Q如果我们要做一个加法运,需要先两个QҎ转ؓStringQ然后够造成BigDecimalQ在其中一个上调用addҎQ传入另一个作为参敎ͼ然后把运的l果QBigDecimalQ再转换为QҎ。你能够忍受q么烦琐的过E吗Q下面我们提供一个工LArith来简化操作。它提供以下静态方法,包括加减乘除和四舍五入:
public static double add(double v1,double v2)
public static double sub(double v1,double v2)
public static double mul(double v1,double v2)
public static double div(double v1,double v2)
public static double div(double v1,double v2,int scale)
public static double round(double v,int scale)
附录
源文件Arith.javaQ?br style="font-family: " />
import java.math.BigDecimal;
public class Arith {
// 默认除法q算_ֺ
private static final int DEF_DIV_SCALE = 10 ;
// q个cM能实例化
private Arith()
{
;
}
/** */ /**
* 提供_的加法运?br />
* @param v1 被加?br />
* @param v2 加数
* @return 两个参数的和
*/
public static double add( double v1, double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
/** */ /**
* 提供_的减法运?br />
* @param v1 被减?br />
* @param v2 减数
* @return 两个参数的差
*/
public static double sub( double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/** */ /**
* 提供_的乘法运?br />
* @param v1 被乘?br />
* @param v2 乘数
* @return 两个参数的积
*/
public static double mul( double v1, double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
/** */ /**
* 提供Q相对)_的除法运,当发生除不尽的情冉|Q精到
* 数点以?0位,以后的数字四舍五入?br />
* @param v1 被除?br />
* @param v2 除数
* @return 两个参数的商
*/
public static double div( double v1, double v2)
{
return div(v1,v2,DEF_DIV_SCALE);
}
/** */ /**
* 提供Q相对)_的除法运。当发生除不的情况Ӟ由scale参数?br />
* 定精度,以后的数字四舍五入?br />
* @param v1 被除?br />
* @param v2 除数
* @param scale 表示表示需要精到数点以后几位?br />
* @return 两个参数的商
*/
public static double div( double v1, double v2, int scale)
{
if (scale < 0 )
{
throw new IllegalArgumentException( " The scale must be a positive integer or zero " );
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/** */ /**
* 提供_的小C四舍五入处理?br />
* @param v 需要四舍五入的数字
* @param scale 数点后保留几位
* @return 四舍五入后的l果
*/
public static double round( double v, int scale)
{
if (scale < 0 )
{
throw new IllegalArgumentException( " The scale must be a positive integer or zero " );
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal( " 1 " );
return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
]]>
վ֩ģ壺
|
|
ɽ |
|
|
|
̩ |
ָɽ |
ľ |
üɽ |
ˮ |
ʳ |
|
|
|
|
߷ |
¡ |
ϻ |
̫ |
|
|
|
ʱ |
¤ |
¡ |
Զ |
Ӫ |
|
ɽ |
ǹ |
|
ƽɽ |
|
|
˳ |
ͤ |
|
|
|
|