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 以外でこのコードを実行できるようにしたいのですが、invoke メソッドの呼び出しに問題があります。不一致例外。

よろしくお願いします

4

2 に答える 2

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 に答える
0

Timmos が述べたように、 enum 定数の代わりに aIllegalArgumentExceptionを渡すという事実からの結果です。を取得する正しい方法は、クラスを使用することです。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 に答える