Locale.getDefault(Locale.Category.FORMAT)在java中使用反射

时间:2012-11-30 09:04:09

标签: java-7

*import java.util.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.*;
public class LocaleProgram {
 public static void main(String[] args) {
    try {

        Class c = Class.forName("java.util.Locale");
        Class c1 = Class.forName("java.util.Locale$Category");
        Class[] paramTypes = { c1 };
         try {
         Method m = c.getMethod("getDefault", paramTypes);

             try {
                 //Object o = m.invoke(c1);
                 Object o = m.invoke(c1,new Object[]{"FORMAT"});
                 System.out.println("Object:" + (Locale)o);
                 } catch (IllegalArgumentException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             } catch (IllegalAccessException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                 e.printStackTrace();
             }
        } catch (SecurityException e) {
        // TODO Auto-generated catch block
         e.printStackTrace();
        } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
         e.printStackTrace();
         } 

    }catch (ClassNotFoundException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
 }
}*

基本上我希望Locale.getDefault(Locale.Category.FORMAT)使用反射,这样我就可以在Java版本7以外的地方运行这个代码了。但是我在调​​用invoke方法时遇到了麻烦,它给了我java.lang.IllegalArgumentException :参数类型不匹配异常。

非常感谢提前

2 个答案:

答案 0 :(得分:0)

更改此行

Object o = m.invoke(c1,new Object[]{"FORMAT"});

Object o = m.invoke(c1,new Object[]{Locale.Category.FORMAT});

但是,这可能不是您想要的,因为您想通过使用反射来创建使用的枚举?

这在Java 1.6下不起作用,因为这些枚举还不存在。

一些方便的内容:http://blog.ej-technologies.com/2011/12/default-locale-changes-in-java-7.html

答案 1 :(得分:0)

正如Timmos所说,IllegalArgumentException结果来自于您传递了String而不是Locale.Category枚举常量。获取Locale.Category.FORMAT的正确方法是使用java.lang.reflect.Field类:

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Locale;

public class GetDefaultLocale {

    public static void main(String[] args){
        Locale locale = null;
        try {           
                Class<?> LOCALE_CATEGORY_Class = Class.forName("java.util.Locale$Category");
                Class<?> LOCALE_Class = Class.forName("java.util.Locale");

                Class<?>[] paramTypes = { LOCALE_CATEGORY_Class };
                Method m = LOCALE_Class.getMethod("getDefault", paramTypes);

                Field FORMAT_Field = LOCALE_CATEGORY_Class.getField("FORMAT");
                //we pass null because the FORMAT is an enumeration constant(the same applies for class variables)
                Object FORMAT = FORMAT_Field.get(null);
                locale = (Locale)m.invoke(LOCALE_CATEGORY_Class, new Object[]{FORMAT});
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        //for jre 6
        if(locale == null){
            locale = Locale.getDefault();
        }   
    }