第十三章、反射、类加载与垃圾回收

     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()方法、以及什么时候执行该方法,都是不确定的

posted on 2014-04-24 11:04  smile小红帽  阅读(126)  评论(0编辑  收藏  举报