java类文件通过类加载器加载到内存中。
类加载器包括
根类加载器:其是用本地代码实现,负责加载核心java类
扩展类加载器:负责加载扩展的java的类
系统类加载器:负责加载应用程序自身的类
还可以通过继承ClassLoader(抽象类)基类来创建自定义的类加载
类加载的三个阶段
加载、连接(验证、准备、解析)、初始化三个阶段,加载完后得到一个class对象
反射
java程序中的对象在运行时会出现两种类型:编译时类型和运行时类型,例如:
Employee s(编译时类型为Employee)=new Salary()(运行时类型为Salary);
在java程序中获得Class对象有三种方式
第一种:
反射是指java中,可以运行期载入、探知和使用编译器完全未知的类。通过使用java反射机制,
我们可以获得类的信息,并动态创建对象、设定成员变量的值、调用方法以及动态创建和访问数组
例如:
//class.forName(className)方式的反射
Scanner scan = new Scanner(System.in);
System.out.print("请输入:");
String className = scan.next();
Class c3 = Class.forName(className(全限定类名即包名.类名));
//得到构造方法及其参数,并且可以获取对应的参数类型
// Constructor[] cons = c3.getConstructors();
//
// for(int i=0; i
// System.out.println(cons[i].getGenericParameterTypes().length);
// if(cons[i].getGenericParameterTypes().length>0){
// System.out.println(cons[i].getGenericParameterTypes()[0]);;
// }
// }
第二种
在编译时知道类名的情况用:Class c=类名.class;//调用该类的class属性来获得该类的Class
对象
第三种
如果一个类的实例对象已经得到,则调用该对象的getClass()方法返回该对象所属类对应的的Class
对象,getClass()方法属于Object类的,所以所有对象都可以使用:
例如:Dong d=new Dong();
Class c=d(对象名).getClass();
垃圾回收
对象不可获得就会被垃圾回收,System.gc()或者Runtime.gc()方法是程序员与JVM的垃圾回收器
进行通讯的唯一机制,但是gc()方法并不能保证垃圾回收器立即执行垃圾回收,只能促使垃圾回收器
尽快回收无用的对象
对象的finalize()方法可以帮助我们完成一些释放对象所占用的资源等收尾工作。但是垃圾回收
器是否执行finalize()方法、以及什么时候执行该方法,都是不确定的