黑马程序员——【Java反射学习】动态加载类

来源:互联网 发布:php后台管理app 编辑:程序博客网 时间:2024/05/15 08:03
------Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
  • Class类的使用
  • 方法的反射
  • 成员变量的反射
  • 构造函数的反射
  • 反射的应用:测试泛型的本质



Class.forName("类的全称")
  • 不仅表示了类的类类型,还表示了动态加载类
  • 在这里需要区分编译、运行
  • 编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
class Office
{
public static void main(String[]args)
{
if("Word".equals(args[0]))
{
Word w=new Word();
w.start();
}
if("Excel".equals(args[0]))
{
Excel e=new Word();
e.start();
}
}
}


//此时编译有4处错误,因为找不到Word和Excel类
//---------------------------------
class Word
{
public static void start()
{
System.out.println("word.start")
}
}
//当我们建立了Word类,此时编译就只剩下两处错误了。
//那么问题来了,我们现在只需要用到Word软件,但程序却无法编译通过,这时,我们该怎么办呢?
//-----------------------------------


分析:new创建对象是静态加载类,在编译时刻就需要加载所有可能使用到的类。
现实生活中,我们希望的是我们用到什么类就运行什么类,我们用word的时候,
只要word能用就行了,没必要去管Excel能不能用。这就是编译时刻加载导致的。
那么,怎样才能在运行时刻才加载呢?我们接着往下看


class OfficeBetter
{
public static void main(String[]args)
{
try
{
//动态加载类,在运行时刻加载
Class c=Class.forName(args[0]);
//通过类类型,创建该类对象
OfficeAble oa=(OfficeAble)c.newInstance();
oa.start();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
interface OfficeAble
{
public void start();
}
class Word implements OfficeAble
{
public static void start()
{
System.out.println("word.start")
}
}


-------------------------------
OfficeAble接口和Word类特别简单,就不做过多赘述,看不懂的再回去好好复习一下接口相关的内容。
我们看主函数,运用了动态加载类的方法,在编译的时刻不加载任何类。
运行主函数时,我通过键盘获取要加载的类名,通过类类型,创建类对象,然后再用对象调用相应的方法
此时,我们在运行的时候输入“Word”,就可以调用“Word”程序
当我们输入"Excel"时,才会报错,此时解决方法是:
创建一个Excel类,并且接上OfficeAble接口,编译保存在主函数同目录下,在运行主函数调用即可。


动态加载大大提高了程序的扩展性,便于程序的维护和升级更新。
就拿上面的程序来说,我的程序里面有word和Excel两个功能,当其中一个功能出了问题,并不影响领一个功能的使用。试想市场上随便一件产品,功能都会有成百上千个,如果都使用静态加载的话,那么随便一个功能出了问题,就会导致该产品无法使用。打个比方说假如你笔记本电脑的"Enter"键因为按的次数太多坏了,从而导致你得笔记本电脑没法使用,你会不会很郁闷?







0 0
原创粉丝点击