Java反射【二、Class类的使用】

类本身也是对象,是java.lang.Class类的实例对象——There is a class named Class.

Class类表示方式

Class类只有Java虚拟机才能初始化,有三种表示方式(Demo是一个类)
1、Class c1=Demo.class;
2、Demo d = new Demo();
   Class c2 = d.getClass();
3、Class c3 = Class.forName("PackageName+ClassName");//使用类的全名获取类的类对象,需要try catch

使用类的类对象创建类对象(有点绕,就是用Class对象创建具体的类对象)

Demo d1 = c1.newInstance();

编译和运行

使用eclipse时Run会一并进行编译和运行,感知不是很清晰
用txt写java代码,命令行编译执行比较明确
javac 用于编译.java 文件为 .class文件
java 用于运行.class 文件

静态加载类和动态加载类

静态:使用new创建一个类即为静态加载(编译时刻加载)
动态:使用class.newInstance()创建一个类即为动态加载(运行时刻加载)

  • 以下举例说明动态加载的优势:
    有一个Porject程序,其中需要使用到A类和B类,最初实现如下:

      public class StaticAndDynamicClass {
      public static void main(String[] args) {
      AClass a = new AClass();
      a.exe();
      
      BClass b = new BClass();
      b.exe();
      }
      }
    

这样运行肯定会报错,因为AClass和BClass不存在

如果AClass存在呢?

public class AClass {
public static void Exe(){
	System.out.println("AClass execute...");
}
}

此时报两个错,BClass找不到

这就是静态加载类的特点,需要将用到的所有类全部加载之后才能编译
如果利用newInstance动态的加载类,就可以不用关心类是否完全加载,只要在运行时判断即可

public class StaticAndDynamicClass {

public static void main(String[] args) {
//		AClass a = new AClass();
//		a.Exe();
//		
//		BClass b = new BClass();
//		b.Exe();
	//创建一个接口,符合该接口定义的类都可以被动态加载
	Class c = null;
	try {
		 c = Class.forName(args[0]);
		 ISADC a = (ISADC) c.newInstance();
		 a.Exe();
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (InstantiationException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IllegalAccessException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
}

ISADC是一个统一定义接口,凡是符合该接口的类名称都可以通过传参动态的加载进来

原文地址:https://www.cnblogs.com/shanelau/p/6577823.html