黑马程序员——【Java反射学习】动态加载类
来源:互联网 发布:php后台管理app 编辑:程序博客网 时间:2024/05/15 08:03
------Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
- Class类的使用
- 方法的反射
- 成员变量的反射
- 构造函数的反射
- 反射的应用:测试泛型的本质
Class.forName("类的全称")
{
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"键因为按的次数太多坏了,从而导致你得笔记本电脑没法使用,你会不会很郁闷?
- 不仅表示了类的类类型,还表示了动态加载类
- 在这里需要区分编译、运行
- 编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
{
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
- 黑马程序员——【Java反射学习】动态加载类
- 黑马程序员————java中类的加载、反射、动态代理、枚举
- 黑马程序员——反射——类的加载,反射的应用,简单动态代理
- 黑马程序员—java基础学习--反射
- 黑马程序员--Java学习日记之类的加载,反射,动态代理,枚举
- 黑马程序员——Java反射&动态代理
- 黑马程序员—Java 反射
- 黑马程序员—Java反射
- 黑马程序员------------反射、内省、类加载、动态代理
- Java反射——动态加载类
- 黑马程序员 JAVA 学习笔记——类加载器
- 黑马程序员 java学习笔记——类加载器
- 黑马程序员——反射和类的加载
- 黑马程序员java学习笔记,反射及动态代理
- 黑马程序员——Java中类的加载与反射笔记
- 黑马程序员—Java基础—类的加载和反射
- 黑马程序员之java类加载器和java中的反射机制学习
- 黑马程序员—JAVA高新技术之类加载器、动态代理
- 打印正三角形与倒三角形(C++)
- iOS 获取文本内容的高度
- 简单排序(冒泡、选择、插入)
- ELF format
- Android开发开源项目之-PullToRefresh源码分析
- 黑马程序员——【Java反射学习】动态加载类
- 树查找(三)Treap树
- java.io.IOException: invalid header field
- docker -d 不能起来
- 5-5
- HTML5 New Feature Series: Communication
- 【百度之星资格赛】 1002 列变位法解密
- Android屏幕适配全攻略(最权威的官方适配指导)
- 第十二周项目三 日期时间类