版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/88018905
目录
基本概念
这里演示下Java的动态加载类。因为在编译的时候,加载类是静态加载,运行时加载是动态加载。
在此我对反射有了如下的理解:
如果有一个class A,可以使用new A()来创建对象,但如果要使用字符串"A"来创建class A的对象,在Java中通过java.lang.class中的Class可以把一个类当成一个变量,然后通过字符串,去创建,就是反射。
Java是本身就具备这种性质的,而C++本身不具备,需要自己去写,稍后会给出C++的仿Java反射机制。
演示
有如下的两个文件:
Eclipse结构如下:
Office.java源码如下:
package dynamicJava;
class Office
{
public static void main(String[] args){
if("Word".equals(args[0])){
Word w = new Word();
w.start();
}
else if("Excel".equals(args[0])){
Excel e = new Excel();
e.start();
}
}
}
Word.java源码如下:
package dynamicJava;
class Word{
public static void start(){
System.out.println("Word starts");
}
}
Eclipse运行如下:
使用Javac编译下,发现如下:
发现没有Excel类。因为这是在编译时加载。
这里就存在一个问题,如果有100个功能,有1个有问题,那么余下的99个功能都用不了。
这里可以利用反射机制,实现动态加载的功能,也就是在运行时,加载类,使用多态,制定一个标准即可。
文件结构如下:
源码如下:
Office.java
package my;
class Office
{
public static void main(String[] args){
try{
Class c = Class.forName("my.Word");
//通过类类型,创建该类对象
OfficeAble oa = (OfficeAble)c.newInstance();
oa.start();
}
catch(Exception e){
e.printStackTrace();
}
}
}
OfficeAble.java
package my;
interface OfficeAble
{
public void start();
}
Word.java
package my;
class Word implements OfficeAble{
public void start(){
System.out.println("Word starts");
}
}
这样就实现了,运行截图如下: