0
*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 以外的版本上运行此代码。但是我在调​​用调用方法时遇到了麻烦,它给了我 java.lang.IllegalArgumentException: argument type不匹配异常。

提前谢谢了

4

2 回答 2

0

正如 Timmos 所说的那样,您传递的是 a而不是枚举常量IllegalArgumentException这一事实的结果。获取的正确方法是使用类:StringLocale.CategoryLocale.Category.FORMATjava.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();
        }   
    }
于 2013-09-17T14:04:35.233 回答
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

于 2013-01-24T10:25:10.393 回答