java反射传入参数是list,具体该怎么写?

发布于 2022-09-11 18:56:28 字数 525 浏览 20 评论 0

Method writefile = basiclib.getDeclaredMethod("writeFile", new Class[] {List<String>.class,String.class});

            List<String> lines2 = (List<String>) readfile.invoke(null, new Object[] {filepath2});
            

            
            lines2 = (List<String>)
                    _methods[i].invoke(_actionxp1,
                            new Object[] {lines2});
                            
                            

这么写好像不太对,网上一搜索list全跑出来获取泛型数据类型,这尼玛的真坑。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如果没结果 2022-09-18 18:56:28

List.class即可,泛型参数在编译后会被擦除掉,无论List里面是String还是什么别的东西都不会影响获取到那个method,在invoke的时候传的参数对不上的话才会产生异常

//Test.java
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Test {
    public static void main(String[] args) throws InterruptedException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        final Class<Tmp> tmpClass = Tmp.class;
        final Method printStrings = tmpClass.getDeclaredMethod("printStrings", List.class);
        List<String> strings = Stream.iterate(1, t -> t + 1).limit(10).map(Object::toString).collect(Collectors.toList());
        List<Integer> integers = Stream.iterate(1, t -> t + 1).limit(10).collect(Collectors.toList());
        printStrings.invoke(new Tmp(), strings);//正常执行,打出1~10
        printStrings.invoke(new Tmp(), integers);//产生异常
    }
}

class Tmp {
    void printStrings(List<String> strings) {
        strings.forEach(System.out::println);
    }
}

输出

1
2
3
4
5
6
7
8
9
10
Exception in thread "main" Disconnected from the target VM, address: '127.0.0.1:56752', transport: 'socket'
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at Test.main(Test.java:17)
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at java.util.ArrayList.forEach(ArrayList.java:1249)
    at Tmp.printStrings(Test.java:23)
    ... 5 more

Process finished with exit code 1
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文