反射之静态加载类和动态加载类的区别和应用

Java的静态加载类和动态加载类两个概念,想必有不少的程序员一直是一知半解,不知道为什么动态加载类功能的存在,其中一大部分的原因是现在开发工具导致的,如Eclipse、Idea等等,自动编译,而我当初学程序是从使用Editplus开始的,使用Javac编译和Java运行,编译和运行在时间上有了更大的跨度。

以下代码是静态加载类的实例:

package com.xq.core.dynamic;

public class DynamicStatis {
	
	public static void main(String[] args) {
		
		if("teacher".equals(args[0])) {
			Teacher t = new Teacher();
			t.getAvgAge();
		}else if("student".equals(args[0])) {
			Student s = new Student();
			s.getAvgAge();
		}
		
	}
}

上面的代码中的前提是Teacher和Student还没有编译,此代码在javac的编译阶段,就会报错,因为使用new关键字来实例对象时,此时就是静态加载类,编译时会查看类用到的所有类是否都可以找到。而此类在实际的生产环境中如果这样实现,不仅仅给内存提高了要求,也有了很多的限制,如果项目目前只需要Teacher就可以满足需求了,而迫于代码的原因,不得不把Student也实现了才可以使用,反之一样,程序代码中的工具类往往都会存在类似的问题,此时通过动态加载类的方式就可以很好的解决此问题:

分别创建DynamicClass类、People接口类、Student类、Teacher类,其中Student和Teacher实现People接口,为了能够面向接口编程,减少依赖,降低耦合度

看DynamicClass类的源码就可以很清楚了

package com.xq.dynamic;

public class DynamicClass {
	
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		
		Class ct = Class.forName(args[0]);
		//面向接口编程
		People tea = (People) ct.newInstance();
		tea.getAvgAge();
	}
}

通过使用动态类加载技术,在工具类中,不再需要进行大量的判断,通过输入的参数,动态加载需要使用的类即可,在获取类的实例化对象时,也不再向上转型为具体的实现类,而是面向接口,提高了应用的扩展性,在People的类别增加或者变化上,不需要修改工具类,均可以获得相应类别的平均年龄。

通过静态类加载和动态类加载的实现对比,可以很好的掌握二者之间的区别和动态加载类的优势。

你可能感兴趣的:(Java)