java Class.forName 问题 高手帮忙

来源:百度知道 编辑:UC知道 时间:2024/09/18 05:27:16
Test01.java 内容如下:
package com.test;
public class Test01 {
static {System.out.println("Class 加载成功");}
Test01(){
System.out.println("实例创建成功");
}
}

Test02.java:
import com.test.*;
public class Test02{
public static void main(String[] args){
Class c = null;
try{c=Class.forName("com.test.Test01");}
catch(Exception e){
System.out.println("Cannot load Test01");
System.exit(0);
}
try{Test01 t = (Test01)c.newInstance();}
catch(Exception e){System.out.println("创建实例失败!");
}
}
}

我期望输出是
“CLass 加载成功”
“实例创建成功”
但是实际输出是 :
““CLass 加载成功”
“实例创建失败!”

请各位高手指点!

你对Test01打包了package com.test; 而且Test01的无参构造方法不是public的,包外访问不了,所以不能newInstance();改成:
public Test01(){
System.out.println("实例创建成功");
}

刚才帮你测试了一下 我这里怎么是成功的...
debug:
Class 加载成功
实例创建成功
成功生成(总时间:3 秒)
你在System.out.println("创建实例失败!"); 前面加多一句e.printStackTrace();然后看它输出什么错误

“实例创建失败!” 在哪里打印的??你捕捉异常的是创建实例失败。我的也是成功,自己Debug下,很好解决的

public T newInstance()
throws InstantiationException,
IllegalAccessException创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化这个类。
注意,此方法传播 null 构造方法所抛出的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译时的异常检查,而在其他情况下编译器都会执行该检查。 Constructor.newInstance 方法将该构造方法所抛出的任何异常包装在一个(已检查的)InvocationTargetException 中,从而避免了这一问题。

返回:
此对象所表示的类的一个新分配的实例。
抛出:
IllegalAccessException - 如果该类或其 null 构造方法是不可访问的。
InstantiationException - 如果此 Class 表示一个抽象类、接口、数组类、基本类型或 void; 或者该类没有 null 构造方法; 或者由于其他某种原因导致实例化失败。
ExceptionInInitial