2016-04-25 36 views
1

問題在Java reflectiion炭[]用於方法參數

SampleClass

Class Question{ 
     public int a (String a, char[] c,int b) { return b; }  
} 

方法通過反射

public Method getMethodWithParams(Class<?> klasa, String methodName, Class<?>[] params) throws 
      SecurityException, NoSuchMethodException { 
     Class<?>[] primitivesToWrappers = 
        ClassUtils.primitivesToWrappers(params); 
     Method publicMethod = MethodUtils.getMatchingAccessibleMethod(klasa, 
                     methodName, 
                     primitivesToWrappers); 
     System.out.println(publicMethod.toGenericString()); 

     return publicMethod; 
    } 

private void printParams(Type[] types) throws ClassNotFoundException { 

     for (Type genericParameterType : types) { 
      System.out.println(genericParameterType.toString()); 

     } 

    } 

獲得方法與名稱和參數java類的全量化名主程序

Question cls = new Question(); 
    Class<?>[] paramString = new Class<?>[3]; 
      paramString[0] = String.class; 
      paramString[1] = char[].class; 
      paramString[2] = int.class; 
    Method methodParams1 = getMethodParams(cls.getClass(),"a", paramString); 
      System.out.println(methodParams1.getName()); 
      Type[] genericTypes = methodParams1.getParameterTypes(); 
      printParams(genericTypes); 

輸出是:

一個

類java.lang.String

類[C

INT

問題是,下一個測試失敗

Character testCharacterObjArray = new Character[] 
Class<?> aClass = ClassUtils.getClass("[C", true); 
Assert.assertEquals(testCharacterObjArray.getClass(), aClass); 

ClassUtils來自org.apache.commons.lang3

尋找一個庫來獲取「[Ljava.lang.Character;」而不是「[C」,因爲它出現ClassUtils.primitivesToWrappers()失敗。基於stephen

解決方案:

public Class<?> convertStringToClass(String str) throws 
     ClassNotFoundException { 
    Class<?> aClass = ClassUtils.getClass(str, true); 

    if (aClass.isArray()) { 

     Class<?> primitiveToWrapper = 
       ClassUtils.primitiveToWrapper(aClass.getComponentType()); 
     Object newInstance = Array.newInstance(primitiveToWrapper, 0); 
     System.out.println("****" + newInstance.getClass().getName()); 
     return ClassUtils. 
       getClass(newInstance.getClass().getName(), true); 
    } 
    else { 
     return ClassUtils.primitiveToWrapper(aClass); 
    } 

} 
+0

我不明白的考驗,你爲什麼不想要有testCharacterObjArray = char []。class? (順便說一下,測試不能編譯) – Betlista

回答

2

的原因,這種失敗:

Character[] testCharacterObjArray = new Character[] 
Class<?> aClass = ClassUtils.getClass("[C", true); 
Assert.assertSame(testCharacterObjArray.getClass(), aClass); 

是, 「[C」 表示char[]不是Character[]

char[].class之所以不能撥打ClassUtils.primitivesToWrappers()是因爲char[]不是原始類型!

如果你想一個數組的本原類映射到陣列的封裝器的類,然後:

  1. 使用Class.isArray()以測試類型爲數組
  2. 使用Class.getComponentType()得到基本類型
  3. 如果基本類型是基本類型,則映射它。
  4. 使用Arrays.newInstance(baseType, ...)創建映射的基本類型的陣列類型來創建一個數組,然後在其上調用getClass()
+0

要馬上試試 – nkvnkv

+0

耶,它的工作,非常感謝 – nkvnkv

1

恐怕你的問題不僅在primitivesToWrappers

而且getMatchingAccessibleMethod並不如我所期望的:

在Java中我可以打電話:

new Question().foo("a", new char[] {'a'}, 1); 
    new Question().foo("b", new char[] {'b'}, Integer.valueOf(2)); 

    new Question().bar("c", new char[] {'c'}, 3); 
    new Question().bar("d", new char[] {'d'}, Integer.valueOf(4)); 

這會導致編譯錯誤,在Java中:

new Question().foo("b", new char[] {'b'}, Integer.valueOf(2)); 

但MethodUtils測試:

Method m1 = MethodUtils.getMatchingAccessibleMethod(Question.class, "foo", String.class, char[].class, int.class); 
    System.out.println("m1:" + m1); 
    Method m2 = MethodUtils.getMatchingAccessibleMethod(Question.class, "foo", String.class, char[].class, Integer.class); 
    System.out.println("m2: " + m2); 
    Method m3 = MethodUtils.getMatchingAccessibleMethod(Question.class, "foo", String.class, Character[].class, Integer.class); 
    System.out.println("m3: " + m3); 

    Method mb1 = MethodUtils.getMatchingAccessibleMethod(Question.class, "bar", String.class, char[].class, int.class); 
    System.out.println("mb1: " +mb1); 
    Method mb2 = MethodUtils.getMatchingAccessibleMethod(Question.class, "bar", String.class, char[].class, Integer.class); 
    System.out.println("mb2:" + mb2); 

輸出是(和我預計的M2和MB1 NOT NULL):

m1: public int LangTest$Question.foo(java.lang.String,char[],int) 
m2: null 
m3: null 
mb1: null 
mb2: public int LangTest$Question.bar(java.lang.String,char[],java.lang.Integer) 

我修改你的問題類:

static class Question { 
    public int foo(String a, char[] c,int b) { return b; } 
    public int bar(String a, char[] c,Integer b) { return b; } 
} 
+0

這也是要考慮的事情 – nkvnkv