一、需要一个辅助Student类
public class Student {
static{
System.out.println("静态代码块执行了");
}
public void outAge(Integer num){
System.out.println(num+"有参方法执行了~~~~~~~~~~");
}
public void outName(){
System.out.println("无参方法执行了~~~~~~~~~~");
}
}
二、主要加载类逻辑
public class ClassLoadTest {
public static void main(String[] args) throws Exception{
//动态加载类,获取当前类的Class对象
Class student = Class.forName("com.wd.cms.common.load.Student");
//获取Student类名称为outName地方法
Method name = student.getMethod("outName");
//调用outName方法
name.invoke(student.newInstance()); //通过实例化的对象,调用无参数的方法
//获取类中名称为Student的方法,String,class是参数类型(调用含有参数的方法,参数的类型必须为包装类)
Method age = student.getMethod("outAge", Integer.class);//注意参数不是String
//调用Student方法,其中27是方法传入的参数值
age.invoke(student.newInstance(),26);//通过对象,调用有参数的方法
System.out.println("=======================Class.forName加载类完成=======================");
//这种方式不会进行类初始化
Class student1 = ClassLoader.getSystemClassLoader().loadClass("com.wd.cms.common.load.Student");
Method name1 = student.getMethod("outName");
//调用outName方法
name1.invoke(student1.newInstance()); //通过实例化的对象,调用无参数的方法
System.out.println("=======================ClassLoader加载类完成=======================");
}
}
运行输出结果
静态代码块执行了
无参方法执行了~~~~~~~~~~
26有参方法执行了~~~~~~~~~~
=======================Class.forName加载类完成=======================
=======================ClassLoader加载类完成=======================
总结:对于Class.forName加载的类,会使类进行初始化(使用场景,JDBC的加载过程),而ClassLoader.getSystemClassLoader().loadClass("类全限名")加载类的方式,则不会对类进行初始化,