java怎么通过反射实例化另一个已经引入的maven项目里的类?
代码:
` 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这个报错其实写的很清楚了哈,就是找不到无参的构造方法
那为什么找不到无参的构造方法,因为你选择的创建对象的方式是
newInstance()
,查看源码你可以看到,获取构造方法的时候,传入的参数就是一个空数组,这是newInstance()
的默认实现那一般来说我们新创建一个类,不写任何构造方法的时候,是会默认生成一个无参的构造方法的,如果增加了一个你自定义的任何构造方法,那个无参的构造方法就不会被自动生成,所以你可以查看一下这个类
com.github.wycm.API._douban
,他一定是没有无参构造方法的,因此才会报错当然也不会是因为把无参构造方法改为不是
public
的,因为在刚才截图中可以看到第二个参数是Member.DECLARED
,所以是要找到所有声明的构造方法,但是如果你的无参构造方法此时真的不是public
,那应该是报其他类似xxx can not access xxx
的错误那回到问题本身,既然
com.github.wycm.API._douban
没有无参构造方法,那用反射创建对象一般都是class.getDeclaredConstructor(Class<?>... parameterTypes)
找到你想要用的构造方法Constructor
Constructor
使用newInstance(Object ... initargs)
方法来创建对象即可,其中方法就按照构造方法顺序传入参数即可比如
com.github.wycm.API._douban
有一个两个参数的构造方法String
和Integer
那么你就应该这样创建对象
差不多就是这样吧,以上仅供参考
盲猜没有无参构造方法,或者不是public的