*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 :参数类型不匹配异常。
非常感谢提前
答案 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();
}
}