java之动态加载类

 @Java反射机制——动态加载类
        类类型的获取有三种方式,假设已知Student类
方式一: Class c1 = Student.class;
方式二:Student stu = new Student(); Class c2 = stu.getClass();
方式三:已知Student类在包:com包下,则 Class c3 = Class.forName(com.Student");
1、静态加载类,是编译时刻加载;动态加载类,是运行时刻加载
2、new创建对象:是静态加载类,在编译时刻就需要加载所有的【可能使用到的类】。有一个类有问题(如不存在),都不能通过编译,会报错。
3、Class.forName()通过动态加载类,可以用到一个类时,才进行加载。
【功能性的类尽量使用动态加载,并对新添的类实现功能性接口(标准),这样就不用重新编译】
编译时刻加载类是静态加载类,运行时刻加载类是动态加载类

new 创建对象是静态加载类,在编译时刻就需要加载所有的可能使用到的类
通过Class a=Class.forName(arg[0]);此时为动态加载,因为编译时不知道使用哪个类,因此编译没有加载任何类,通过编译。运行时,根据 Java OfficeBetter Word (Word为arg[0],也是类类型),去确定a是哪个类。这就是动态加载。如果word不存在,此时运行会报错。这就是为何有时候会出现编译通过,运行报错的原因。<br>
动态加载一个好处,就是可以随时增加需要编译的类。例如没有excel类,只有word类,也可以运行,需要excel类时再由程序员写此类(为了能统一控制,word类、excel类需要继承同一个父类或者继承同一个接口)。
代码实现:

package com.whoami.reflex;
/**
 * 
 * @author ZYong
 *java反射
 *实现java类的动态加载
 */
public class test {
public  static void main(String[] arg){
//第一种加载方式(静态)
Student stu = new Student();
//第二种加载方式,动态加载
Class c1 = Student.class;
Class c2 = stu.getClass();
try {
//第三种加载方式,会产生异常,使用try catch捕获异常就行
Class c3 = Class.forName("com.whoami.fanshe.Student");
System.out.println(c2==c1&&c1==c3);
//返回结果为true
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Student f= (Student)c1.newInstance();
f.print();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

class Student{
public void print(){
System.out.print("hello");
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值