Java高新技术2----反射应用1

来源:互联网 发布:淘宝平台服务协议最早 编辑:程序博客网 时间:2024/05/07 06:15
 

  不是 JDK1.5的新特性  从1.2开始就有 ,在一些框架中 都会用到反射技术 ,这个技术用到的类就是 Class  .
   我们平时定义类用class ,但是我们这个Class是一个类 ,他代表一类事物  。
   那这个Class类到底代表什么事物呢? 
   我们知道我们定义了一个对象比如 :
   String str=new String() ;
   那么这个str就是一个类的对象实例,并且对象有有一些信息来描述 这个对象的特性 比如他的内容啊 内容的程度啊 等等 。
   这个Class其实也是在描述事物,只是他描述的不是对象的属性,而是Java所有类的属性 等等 、
   每一个Java类都对应一个Class对象 ,描述这个类 有几个方法 几个属性 类的名字 等等
   可以说Class类就是为了描述Java语言中的所有类的 。

 

   如何获得Class对象呢 ? 
  
   比如我们有一个Person类  ,定义Person类的2个对象 
   Person  p1=new Person() ;
   Person  p2=new Person() ;     

   那么我们如何获得Class对象呢 ? 

   Class  c1=new Class() ;//这个是错误的因为Class压根就没提供构造方法 或者构造方法是私有的 我们不可能通过构造来产生对象  
   Class  c2=字节码
  
   字节码文件的作用? 
   字节码文件是 Java源文件编译之后的二进制文件
  当我们使用一个类的时候,那么 JVM 会将类的字节码(也就是二进制文件)加载到内存中 , 然后通过这个字节码 在内存冲产生一个一个的对象 ,这才是对象创建的原理  
   .............................................................................................................................................
  
     如果我用到 String Math Exception这三个类 ,那么内存中 就有三份字节码,那么这三份字节码其实就是三个 Class的对象 。 
   
     Class  c1=Math.class ;//一旦我们用到这个类 那么内存中就会出现类的字节码   字节码就是一个对象 对象的类型就是Class 
  
     Class  c2=object.getClass() ;//返回这个对象的类型的 Class对象 其实就是内存中的字节码    这个是从Object继承来的方法

    
     Class.forName(String classname) ;//这个方法的作用?一道面试题
    1、是Class类的静态方法 用于在JVM中加载一个指定名字的类,如果这个类没被加载那么JVM类加载器会加载类字节码 ,并返回字节码对象 也就是Class对象加载后的字节码会缓存。
  
    2、第二如果 这个类已经被加载过了  ,那么他会保存在JVM的缓存中 ,那么下次我们调用的时候就不需要再次加载了 我们只需要从缓存中取出 Class对象即可   ,节省内存 
    反射的时候 主要使用这个 ,可以动态的产生 Class对象  

    8个基本类型对应8个Class对象   +void  其实有9个Class对象    Class c1=void.class;//这个也正确 因为void也有Class对象


Java反射的应用:  Java中的各种类型均有定义的Class实例对象。 包括 原始类型 引用类型  自定义类型  void类型
package me.Test;
public class ReflectTest
{  
 
 public static void main(String[]args)
 {
  String str="abc" ;
  Class c1=str.getClass() ;  //通过对象的getClass方法返回 
  Class c2=String.class ;   //通过String的class属性
  Class c3 =null;
  try
  {
   c3=Class.forName("java.lang.String") ;    //通过类名字加载
  }
  catch(Exception e)
  {
   e.printStackTrace() ;
  }
  System.out.println(c1==c2) ;
     System.out.println(c2==c3);
     System.out.println(c1==c3);
  System.out.println(c1.isPrimitive());  //不是原始类型
  System.out.println(c2.isPrimitive()); //原始数据类型就是基本数据类型
  System.out.println(c3.isPrimitive());//类不是原始数据类型
  System.out.println(int.class.isPrimitive());//是原始类型
  System.out.println(int.class==Integer.class); //不是原始类型
  System.out.println(int.class==Integer.TYPE); //封装类型的TYPE就表示那个包装的原始数据类型的字节码
     System.out.println(int[].class.isPrimitive());//数组不是原始类型    在Java中所有类型都有Class对象
 } 
 
}

 

 

 


 


  

原创粉丝点击