jdbc class.fornamee("Bean_One").newInstance()为什么会失败,出现找不到类错误ClassNotFoundException

我这么用Class.forName(str).newInstance()出错了吗,还是传参有问题?_百度知道
我这么用Class.forName(str).newInstance()出错了吗,还是传参有问题?
这是我代码,Common是接口,类Plane和Car007实现了这个接口的double getRate(int,int,int)方法,想通过输入Plane或Car007和3个整数,用Common接口引用相应的类实例,然后用接口调用这两个类里面的getRate(畅阀扳合殖骨帮摊爆揩int ,int ,int,)。但运行出现异常,说未找到类Car007,为什么呢?这个类我明明定义了,至于传参,我是在arguments里面输入4个参数,参数之间用空格分开,然后点击Run,这个步骤会出错吗?唉,求指教class ComputeTime{ public static Common i= public static int a=0; public static int b=0; public static int c=0; public static void main(String[] args){
System.out.println(&请输入参数&);
i=(Common) Class.forName(args[0]).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
a=Integer.parseInt(args[1]);
b=Integer.parseInt(args[2]);
c=Integer.parseInt(args[3]);
double d1=i.getRate(a,b,c);
String s=new Double(d1).toString();
System.out.println(s);
//new ComputeTime();
提问者采纳
你不能在forName参数里面直接用agrs[0],主方法main的参数args是需要手动输入的,不然那就是空的,你可以运行public static void main(String[] args) {System.out.println(args[0]);}会报异常,你要给forName输入一个字符串,这个字符串是类Plane畅阀扳合殖骨帮摊爆揩或Car007的完全限定名,就是加包名的类名,比如forName(&fourth.Plane&)等
提问者评价
其他类似问题
为您推荐:
其他2条回答
大概是你第一个参数的原因(Common) Class.forName(args[0]).畅阀扳合殖骨帮摊爆揩newInstance();你已经进行强制为Common了 所以对象确定 参数必须加上其包路径
对象确定是指什么?我本来想直接Common i=Class.forName(args[0]).newInstance(),但报错了,好像意思是Class.forName(args[0]).newInstance()是一个object,提示让加Common。那要实现我所预想的用Common接口引用Plane或Car007的实例应该怎么做呢?包名我加了,还是运行出错,说有空指针异常
Class.forName(args[0]).newInstance()方法就是创建对象与Common i=new Common()一样的但是你是以参数形式传进来的 所以要带包名
Common i=new Common()是错的吧,好吧,你讲的我不太懂,包名我带了
类名要写全,带包名,比如fourth.Car007
恩恩,但改了之后运行又说Exception in thread main:java.lang.nullPointerException,还是有问题
哪一行报的空指针
现在搞定了,是newInstance()那个方法对类有一定要求,谢谢啦
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Class.forName()、Class.forName().newInstance() 、New 三者区别! - shosky - 博客园
终于明白为什么加载数据库驱动只用Class.forName()了!!困扰了我2个小时!!希望我写的这个东西对各位有所帮助。
&& 在Java开发特别是数据库开发中,经常会用到Class.forName(
)这个方法。通过查询Java
Documentation我们会发现使用Class.forName(
)静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance(
)静态方法来实例化对象以便操作。因此,单单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。
这里有必要提一下就是Class下的newInstance()和new有什么区别?,首先,newInstance(
)是一个方法,而new是一个关键字,其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用
new关键字生成对象没有这个限制。
&& 好,到此为止,我们总结如下:
Class.forName("")返回的是类
Class.forName("").newInstance()返回的是object
有数据库开发经验朋友会发现,为什么在我们加载数据库驱动包的时候有的却没有调用newInstance(
)方法呢?即有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一
些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢?
刚才提到,Class.forName("");的作用是要求JVM查找并加载指定的类,如果在类中有静态初始化器的话,JVM必然会执行该类的静态代码
段。而在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC&Driver的 Driver类的代码都必须类似如下:
& public&class&MyJDBCDriver&implements&Driver&{
DriverManager.registerDriver(new&MyJDBCDriver());
既然在静态初始化器的中已经进行了注册,所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了。
贴出Proxool 连接池的静态初始化方法:
public class ProxoolDriver implements Driver {&&& private static final Log LOG = LogFactory.getLog(ProxoolDriver.class);&&& static {&&&&&&& try {&&&&&&&&&&& DriverManager.registerDriver(new ProxoolDriver());&&&&&&& } catch (SQLException e) {&&&&&&&&&&& System.out.println(e.toString());&&&&&&& }&&& }&在一次偶然的跟同行交流的过程中,突然被问及Class.forName()、Class.forName().newInstance() 、New的区别,一时懵了, 竟然在java开发中最常见的一些东西竟说不清道不明的感觉,很不是滋味,于是下来仔细search了一番:
Class.forName( ): Class.forName(&&)返回的是类
forName()静态方法的目的是为了让JVM动态加载指定的类。在加载完成后,还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此单使用Class.forName( )动态加载类是没有用的,其最终目的是为了实例化对象。
Class下的newInstance()&返回的是object
newInstance()&的使用有局限,因为它生成对象只能调用无参的构造函数,而使用new关键字生成对象没有这个限制。
有一个问题是:为什么在我们加载数据库驱动包的时候有的却没有调用newInstance( )方法呢?而有的又调用了newInstance()?
因为在JDBC规范中明确要求Driver类必须向DriverManager注册自己,即任何一个JDBC&Driver的Driver类的代码都必须类似如下:
& public&class&MyJDBCDriver&implements&Driver&{
&& static&{
&&&&&& DriverManager.registerDriver(new&MyJDBCDriver());
可以看出在静态初始化器中已经进行了注册,所以在调用Class.forName( )加载类的时候,静态初始化器代码段就会被执行,使用JDBC时只需要Class.forName()就可以了。
Class.forName(), .class 与 .getClass() 区别:
1、Class.forName() 是一个静态方法,JVM动态的加载指定全类名的class到JVM中,.class是java中所有类的一个属性,.getClass()是所有对象的成员方法;
如:System.out.println(Integer.class); //&class java.lang.Integer
System.out.println(new Integer(10).getClass());&//&class java.lang.Integer
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:105345次
积分:1947
积分:1947
排名:第11147名
原创:81篇
转载:55篇
(1)(1)(1)(3)(2)(1)(8)(2)(12)(33)(1)(1)(20)(22)(3)(2)(12)(11)为什么小弟我的Class.forName()抛出的错误不是ClassNotFoundException,而是RuntimeException - J2SE当前位置:& &&&为什么小弟我的Class.forName()抛出的错误不是Class为什么小弟我的Class.forName()抛出的错误不是ClassNotFoundException,而是RuntimeException&&网友分享于:&&浏览:551次为什么我的Class.forName()抛出的异常不是,而是RuntimeException?try & {
& Class & c & = & Class.forName( &aaaaa &);
& c.newInstance();
} & catch & (Exception & e) & {
& if & (e & instanceof & Class)
& System.out.println( &ClassNotFoundException &);
& else & if & (e & instanceof & RuntimeException) &
& System.out.println( &RuntimeException &);
}------解决方案--------------------绝对是ClassNotFoundException
你真的执行过吗
------解决方案--------------------度过ClassNotFoundException
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有我在main方法里面写了个方法:
public static void main(String[] args) {
def authPath = Class.forName('com.emag.wabao.auth.ProvinceAuth').newInstance()
&&& }
这个是可以正确执行的,输出的结果也对,但是我在项目里面用相同的方法:
for (WabaoBaseAuth auth in authList) {
def clazz = auth.clazz& // clazz 的值为:com.emag.wabao.auth.ProvinceAuth
def authCla = Class.forName(clazz).newInstance()
}
这样就会报classNotFound错误
请大家指教
问题补充:这个我是用grails语言开发的,和java类似的语言
问题补充:错误代码是:
Caused by: java.lang.ClassNotFoundException: com.emag.wabao.auth.ProvinceAuth
at org.codehaus.groovy.tools.RootLoader.findClass(RootLoader.java:156)
at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
at org.codehaus.groovy.tools.RootLoader.loadClass(RootLoader.java:128)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
at java.lang.Class.forName(Class.java:169)
at com.emag.gamecms.service.wabao.BaseAuthService$$ENZLuhtq.checkAuth(BaseAuthService.groovy:16)
... 8 more
class.forName(),括号中的参数必须是字符串,WabaoBaseAuth这个类型是什么?不是字符串啊,这种基于jvm的脚本语言我觉得好恶心,有点四不像的感觉?
看看参数的类型
目测是classpath中没有com.emag.wabao.auth.ProvinceAuth
引用public static Class&?& forName(String className)
&&&&&&&&&&&&&&&&&&&&&&& throws ClassNotFoundException返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于:
& Class.forName(className, true, currentLoader)
其中 currentLoader 表示此类的定义类加载器。
如果forName不行,this.getClassLoader().loadClass(name)应该也不行
1.确定在classpath中含有com.emag.wabao.auth.ProvinceAuth
这个类!而且与当前类文件的class文件放在相同目录;
利用代码可以测试:
this.class.getClass().getResource("/"));查看当前路径
2.利用this.getClassLoader().loadClass(name)试试;
已解决问题
未解决问题}

我要回帖

更多关于 class.newinstance 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信