在读<<thinking in java 4th>>
用到如下代码的时候用到Class.forName()
在前面的例子中也有Class.forName()方法 但依据例子的说法 他不只以完全限定字符串参数产生类型引用 还会执行静态语句 也会执行构造器 这就是说他会实例化 这么理解没错吧 但在下面的例子重 我加了点信息验证 既Class.forName()调用FancyToy构造函数再调用Toy构造函数 却并没有实例化 哪理解错了吗?Class.forName().newInstance()才会实例化 newInstance()前面只会返回引用? 另外有关package 在下面这段代码中package typeinfo.toys;
然后用CMD 进到CLASS所在目录下竟然也说CLASS.NOT.FOUND 异常 按照JAVA的机制 不应该是classpath + “import(全限定名)”的路径自己找吗 我加了“。” 他怎么还找不到。 命令行下非得用 basedir + typeinfo.toys.ToyTest才能用。。
按照我的理解 在本文件重 import自己(绿色段)然后 进到 basedir 然后再-java ToyTest 不就是basedir + typeinfo.toys.ToyTest了吗 这也是报错的。。版面排的比较乱 找了半天没找到在哪改不好意思 谢谢了package typeinfo.toys;
//import typeinfo.toys.*;interface HasBatteries{} //接口位置
interface Waterproof{}
interface Shoots{}class Toy{
Toy(){
System.out.println("here Toy() constructor load!");
}
Toy(int i){
System.out.println("here Toy(int i) constructor load from \"FancyToy(){super(1)}\""); }
}
class FancyToy extends Toy implements HasBatteries,Waterproof,Shoots{
FancyToy(){super(1);} //super 调用父类构造函数
//FancyToy(int i){}
static{
System.out.println("here FancyToy static statment!");
}
}
public class ToyTest{
static void printfInfo(Class cc){
System.out.print("class name:\"" + cc.getName() + "\" is interface?");
System.out.println("[" + cc.isInterface() + "]");
System.out.println("SimpleName:\"" + cc.getSimpleName() + "\"");
System.out.println("CanonicalName:\"" + cc.getCanonicalName() + "\"");
}
public static void main(String[] args){
Class c = null;
try{
//Class c = Class.forName("typeinfo.toys.FancyToy"); 这样c变成了局部变量在域{}外失效
c = Class.forName("typeinfo.toys.FancyToy");
}catch(ClassNotFoundException e){
System.out.println("ClassNotFound!");
System.exit(1);
}
printfInfo(c);
for(Class face : c.getInterfaces())printfInfo(face);
Class up = c.getSuperclass(); //注意观察构造函数信息判断方法是否初始化 OR 只返回引用 up.newInstance() - -! 应为只返回引用
Object obj = null;
try{
System.out.println("after c.getSuperclass() and newInstance()");
obj = up.newInstance();
//up.newInstance();
}catch(InstantiationException e){
System.out.println("Cannot instanciate!");
System.exit(1);
}
catch(IllegalAccessException e){
System.out.println("Cannot access!");
System.exit(1);
}
printfInfo(obj.getClass());
}
}
用到如下代码的时候用到Class.forName()
在前面的例子中也有Class.forName()方法 但依据例子的说法 他不只以完全限定字符串参数产生类型引用 还会执行静态语句 也会执行构造器 这就是说他会实例化 这么理解没错吧 但在下面的例子重 我加了点信息验证 既Class.forName()调用FancyToy构造函数再调用Toy构造函数 却并没有实例化 哪理解错了吗?Class.forName().newInstance()才会实例化 newInstance()前面只会返回引用? 另外有关package 在下面这段代码中package typeinfo.toys;
然后用CMD 进到CLASS所在目录下竟然也说CLASS.NOT.FOUND 异常 按照JAVA的机制 不应该是classpath + “import(全限定名)”的路径自己找吗 我加了“。” 他怎么还找不到。 命令行下非得用 basedir + typeinfo.toys.ToyTest才能用。。
按照我的理解 在本文件重 import自己(绿色段)然后 进到 basedir 然后再-java ToyTest 不就是basedir + typeinfo.toys.ToyTest了吗 这也是报错的。。版面排的比较乱 找了半天没找到在哪改不好意思 谢谢了package typeinfo.toys;
//import typeinfo.toys.*;interface HasBatteries{} //接口位置
interface Waterproof{}
interface Shoots{}class Toy{
Toy(){
System.out.println("here Toy() constructor load!");
}
Toy(int i){
System.out.println("here Toy(int i) constructor load from \"FancyToy(){super(1)}\""); }
}
class FancyToy extends Toy implements HasBatteries,Waterproof,Shoots{
FancyToy(){super(1);} //super 调用父类构造函数
//FancyToy(int i){}
static{
System.out.println("here FancyToy static statment!");
}
}
public class ToyTest{
static void printfInfo(Class cc){
System.out.print("class name:\"" + cc.getName() + "\" is interface?");
System.out.println("[" + cc.isInterface() + "]");
System.out.println("SimpleName:\"" + cc.getSimpleName() + "\"");
System.out.println("CanonicalName:\"" + cc.getCanonicalName() + "\"");
}
public static void main(String[] args){
Class c = null;
try{
//Class c = Class.forName("typeinfo.toys.FancyToy"); 这样c变成了局部变量在域{}外失效
c = Class.forName("typeinfo.toys.FancyToy");
}catch(ClassNotFoundException e){
System.out.println("ClassNotFound!");
System.exit(1);
}
printfInfo(c);
for(Class face : c.getInterfaces())printfInfo(face);
Class up = c.getSuperclass(); //注意观察构造函数信息判断方法是否初始化 OR 只返回引用 up.newInstance() - -! 应为只返回引用
Object obj = null;
try{
System.out.println("after c.getSuperclass() and newInstance()");
obj = up.newInstance();
//up.newInstance();
}catch(InstantiationException e){
System.out.println("Cannot instanciate!");
System.exit(1);
}
catch(IllegalAccessException e){
System.out.println("Cannot access!");
System.exit(1);
}
printfInfo(obj.getClass());
}
}
这条语句(在class FancyToy中) 也是应该运行的啊?它也没有输出
public class Test {
public static void main(String [] args) throws Exception{
Class.forName("xxx.ddd");
} }
class ddd{
static{
System.out.println("here FancyToy static statment!");
}
public ddd(){
System.out.println("######################3333");
}
}out:
here FancyToy static statment!
怎么会没有输出呢?你试试
调用默认的Class.forName(str) 可以初始化, 如果你非要在加载的时候初始化你可以调用显式的加载方法,调用方法如下:Class<?> c = Class.forName(ClassName, true, ClassLoader);
中间的参数就是表示在加载的时候是否初始化静态块的
class FancyToy extends Toy implements HasBatteries,Waterproof,Shoots{
FancyToy(){super(1);} //super 调用父类构造函数
//FancyToy(int i){}
static{
System.out.println("here FancyToy static statment!");
}
}
也有
c = Class.forName("typeinfo.toys.FancyToy"); javac java 确实就没输出这句 所以问出了这问题
想上图 还得先上传出网络地址 这BBS系统。
JDBC时,好像会实例化一个对象.
只是加载这个类? 这个 “加载”的意思是为static分配空间 运行构造器 并初始化 这不已经就是创建了这个类的对象了吗?
这些动作和创建这个类的对象还有什么区别?
另:我运行java javac 时候没加参数 就这么运行的
第一是类的初始化;
第二是对象的创建;
类的初始化是类加载的最后一步,在class.forName()并没有创建一个类的对象,
如果创建了,那么,看下边的程序:public class Test {
public static void main(String [] args) throws Exception{
Class.forName("xxx.dd");
}
}
class dd{
public dd(){
System.out.println("ddd");
}
static{
System.out.println("static");
}
}运行的结果是static,并没有ddd输出,这说明什么,再说,创建类的对象在哪儿?
应该说创建了该类的class对象,并不是该类的实例对象。
先找到 *.class字节码 装载 --> 然后连接(执行字节码检查 不良代码) --> 初始化 这里包括类型的初始化 此时STATIC代码段得到执行 在此之后可以直接调用静态方法(可以叫做创建CLASS对象?) 如果有需要 可以创建对象 即 对象的初始化 这时构造函数工作 Class.forName()返回一个 类型初始化后的结果(先这么说吧 - -!)