类本身也是对象,是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是一个统一定义接口,凡是符合该接口的类名称都可以通过传参动态的加载进来