Java 小技巧

# 用反射拿到基本型別(Primitive Type)

Java Reflection 可以動態的產生類別,但是如果要產生基本型別的話用這樣子的話

{% codeblock lang:java %} Class.forName("int.class"); {% endcodeblock %}

是沒有用的,因為基本型別是在 Integer內的一個欄位,要用反射拿到基本型別的話,就只好建立一個 Map 在根據傳入的 String 取得基本型別。

{% codeblock lang:java %} private static Map nameToPrimitiveClass = new HashMap(); static { nameToPrimitiveClass.put("boolean",Boolean.TYPE); nameToPrimitiveClass.put("byte",Byte.TYPE); nameToPrimitiveClass.put("char",Character.TYPE); nameToPrimitiveClass.put("short",Short.TYPE); nameToPrimitiveClass.put("int",Integer.TYPE); nameToPrimitiveClass.put("long",Long.TYPE); nameToPrimitiveClass.put("float",Float.TYPE); nameToPrimitiveClass.put("double",Double.TYPE); } {% endcodeblock %}

其實這一招在很多 Framework 都有用到,像是 JBoss (opens new window)Spring (opens new window),有興趣可以挖 Code 下來看。

# 將偵測文字並轉型為基本型別

從 XML 讀入參數,因為讀進來的都是文字,如果要偵測參數並轉型為基本型別的話,可以用 Apache Commons Lang (opens new window) 的 NumberUtils 來處理。

{% codeblock lang:java %} Number n1 = NumberUtils.createNumber("100L"); Number n2 = NumberUtils.createNumber("100.0f"); Number n3 = NumberUtils.createNumber("100.0D"); Number n4 = NumberUtils.createNumber("100.0"); {% endcodeblock %}

可以在文字後面加上「f, F, d, D, l, L」 來讓 NumberUtils 轉成 Float、Double、Long,當然也可以都不加,讓 NumberUtils 來猜。