Java反射注入數組或者可變參數


下面兩種寫法,語法上看不出錯誤,算是細節和易錯點吧。

invock方法的第二個參數是可變數組,這個參數可以傳也可以不傳,這個參數可以認為是一個Object類型的數組,如果直接給第二個參數傳遞一個數組,那么此數組將替換Object數組。

假定:我們有一個數組:String arr=new String[]{"a"},希望將這arr個數組注入給我們的方法,

1、如果我們傳遞的是一個普通參數,比如字符串“a”,執行invock(obj,“a”),此時,invock()方法第二個參數值實際上是new Object[]{"a"};

2、同理,如果我們傳遞的是一個數組arr,invock()方法第二個參數應該是new Object[]{arr};

3、但是,如果執行invoce(obj,arr),此時的第二個參數實際上是new String[]{"a"},因為arr數組直接替換掉了Object數組;

4、顯然,參數傳遞的不對,方法的執行結果不是我們想要的,正確的做法是執行invoce(obj,new Object[]{arr})

public class UserTest { List<UserTest> list = new ArrayList<>(); public void testPrint(String... params){ for (String string : params) { System.out.println(string); } } public static void main(String[] args) { try { UserTest userTest=new UserTest(); Class<?> clazz=userTest.getClass(); Method[] methods=clazz.getMethods(); for (Method method : methods) { if(!"testPrint".equals(method.getName())) continue; System.out.println(method.getName()); String[] arr=new String[]{"aaaa",null,"bbbb"}; //正確
        method.invoke(userTest,new Object[]{arr}); } } catch (Exception e) { e.printStackTrace(); } } @Test public void test() { try { UserTest userTest=new UserTest(); Class<?> clazz=userTest.getClass(); Method[] methods=clazz.getMethods(); for (Method method : methods) { if(!"testPrint".equals(method.getName())) continue; System.out.println(method.getName()); String[] arr=new String[]{"aaaa",null,"bbbb"}; //錯誤
 method.invoke(userTest,arr); } } catch (Exception e) { e.printStackTrace(); } } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM