@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()通过动态加载类,可以用到一个类时,才进行加载。
【功能性的类尽量使用动态加载,并对新添的类实现功能性接口(标准),这样就不用重新编译】
编译时刻加载类是静态加载类,运行时刻加载类是动态加载类
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"); } }

被折叠的 条评论
为什么被折叠?



