1.首先,获取到的class文件可以看作是class类型,所以,可不可以通过Class来实例化对象(即通过Class来new一个对象)呢?试一下:
1)我们先写一个User类,如下:
public class User {
public User(){
System.out.println("无参数构造方法 !");
}
public User(String s){
System.out.println("有参数构造方法!");
}
}
2)然后通过Class"调用"这个User类
public class ReflectTest {
public static void main(String[] args) {
try {
Class r1 = Class.forName("com.java.note.User");//这是User的完整包名
Object obj = r1.newInstance();
System.out.println(obj);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
这里用到了Class类的newInstance()方法来创建对象,这个方法在API里的介绍:
而且这个方法会调用User这个类的无参数构造方法,完成对象的创建。
重点: newInstance() 调用的是无参构造,所以必须保证无参构造是存在的!
运行结果:
无参数构造方法 !
com.java.note.User@4554617c
一个User对象创建成功!
2.如果你只是希望一个类的静态代码块执行,其它代码一律不执行,可以使用:Class.forName("完整类名”);
这个方法的执行会导致类加载,类加载时,静态代码块就会执行。
例如:
package com.java.note;
public class Myclass {
//静态代码块在类加载时执行,并且只执行一次。
static{
System.out.println("静态代码块执行!");
}
}
package com.java.note;
public class ReflectTest04 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class.forName("com.java.note.Myclass");
}
}
输出结果:静态代码块执行