Java动态加载类(对反射的基本理解)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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");
	}
}

这样就实现了,运行截图如下:

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/88018905
今日推荐