java怎么通过反射实例化另一个已经引入的maven项目里的类?

发布于 2022-09-12 02:58:41 字数 1519 浏览 25 评论 0

image.png
代码:
` try {

        seleniumBase sb = (seleniumBase)Class.forName("com.github.wycm.API._douban") 
                .newInstance();
        System.out.println(sb);
    } catch (InstantiationException | IllegalAccessException | IllegalArgumentException  
             | SecurityException | ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }`

报错:
` java.lang.InstantiationException: com.github.wycm.API._douban

at java.base/java.lang.Class.newInstance(Class.java:598)
at model.function.reflectUtil.main(reflectUtil.java:32)

Caused by: java.lang.NoSuchMethodException: com.github.wycm.API._douban.<init>()

at java.base/java.lang.Class.getConstructor0(Class.java:3427)
at java.base/java.lang.Class.newInstance(Class.java:585)
... 1 more`

    • *更新报错:eclipse main函数内运行,反射成功。

  而启动Tomcat后调用,反射失败。这怎么回事?

java.lang.ClassNotFoundException: com.github.wycm.API._douban at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:340) at model.API.base.APIBase.executeSeleniumByReflectUtil(APIBase.java:2395)

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

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

发布评论

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

评论(2

断念 2022-09-19 02:58:41

这个报错其实写的很清楚了哈,就是找不到无参的构造方法

那为什么找不到无参的构造方法,因为你选择的创建对象的方式是newInstance(),查看源码你可以看到,获取构造方法的时候,传入的参数就是一个空数组,这是newInstance()的默认实现

image.png

那一般来说我们新创建一个类,不写任何构造方法的时候,是会默认生成一个无参的构造方法的,如果增加了一个你自定义的任何构造方法,那个无参的构造方法就不会被自动生成,所以你可以查看一下这个类com.github.wycm.API._douban,他一定是没有无参构造方法的,因此才会报错

当然也不会是因为把无参构造方法改为不是public的,因为在刚才截图中可以看到第二个参数是Member.DECLARED,所以是要找到所有声明的构造方法,但是如果你的无参构造方法此时真的不是public,那应该是报其他类似xxx can not access xxx的错误

那回到问题本身,既然com.github.wycm.API._douban没有无参构造方法,那用反射创建对象一般都是

  1. 通过class.getDeclaredConstructor(Class<?>... parameterTypes)找到你想要用的构造方法Constructor
  2. 用这个Constructor使用newInstance(Object ... initargs)方法来创建对象即可,其中方法就按照构造方法顺序传入参数即可

比如com.github.wycm.API._douban有一个两个参数的构造方法StringInteger

public _douban(String name, Integer num) {
     this.name = name;
     this.num = num;
}    

那么你就应该这样创建对象

Class sb = Class.forName("com.github.wycm.API._douban");
Constructor<_douban> declaredConstructor = sb.getDeclaredConstructor(String.class, Integer.class);
_douban douban = declaredConstructor.newInstance("douban", 111);

差不多就是这样吧,以上仅供参考

百合的盛世恋 2022-09-19 02:58:41

java.lang.NoSuchMethodException: com.github.wycm.API._douban.<init>()

盲猜没有无参构造方法,或者不是public的

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