A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© swqsljy 中级黑马   /  2013-12-20 13:43  /  1392 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

反射就是把java类中的各种成分映射成相应的java类

1、Class类:        Class类是描述所有java类的类,Class的实例对象就是内存中的一份字节码,当首次用到一个类名或接口名时,先将这个类或接口的java二进制字节码从硬盘加载到内存,class loader的defineClass()方法被JVM调用时,JVM会产生该类的Class对象就是代表二进制码。然后才能去创建对象。当用到很多类时,会有很多字节码,每个字节码就是一个Class对象,得到该类的对象的方法有三种,第一种是类名.Class,第三种是对象名.getClass(),第三种是Class.ForName("类名字符串"。所谓的字节码,就是每个java类被编程后产生的.class文件,这个文件是二进制代码,被加载进内存里面,就是所谓的类的字节码。
      
      获取类或接口的Class对象的三种方式:
      接口也有Class对象,获取方式:接口名.class

    (1)利用Class类的静态方法forName(“类的全名”)获得类的Class对象
         Class<?> class=Class<?>.forName(“java.lang.String”); 返回了String类的Class对象
    (2) Class<?>class=Test.class; 利用类名去获得
    (3) Class<?>class=对象.getClass();利用对象去获得,Object的getClass方法,返回对象真正的Class对象!(不用先强制转化)


     九个预定义Class对象
    8个基本数据类型+void类型  都有Class对象
     Class c=void.class;
     Class c=boolean.class;
     Class c=int.class;
     Class c=char.class;
   包装类用TYPE属性获取:
    Integer.TYPE 获取Integer的Class对象

2.Method是描述java类中的方法的类,
     Method的实例对象就是每个java类中的一个方法。
     得到Method的字节码方式:
          String.class.getMethod("方法名"参数列表的字节码),这样就可以得到具体的方法;
          String.class.getMethods(),可以得到类的所有的方法,返回一个method数组!
          Method.invoke(对象名,值),就可以调用拿到方法,如果对象名为null,则说明该方法是静态的。


3.Field是描述java类中的成员字段的类
      Field的实例对象就是每个java类中的一个成员变量。
      得到Field具体实例对象的方式:
           Field field =String.class.getField("成员变量名"),通过成员变量名,就可以得到具体哪一个成员变量了
           Field [] field =String.class.getFields(),这个方法可以得到类身上的所有成员变量,(除开私有的成员变量
           Field getDeclaredField(String name) 可以强行获取私有变量类,再public void setAccessible(boolean flag)这样声明下,就可以强行获得具体哪个对象的值了!
           Field.get(对象名),可以得到具体在哪个对象上,这个变量的值!

4.Package是描述了java类中的包名的类
      Package的实例对象就是每个java类中的一个包名

5.Constructor是描述了java类中的构造方法的类
      Constructor的实例对象就是每个java类中的一个构造方法!
     要得到一个构造方法的实现,先要得到那个方法所在类的字节码,具体可以如:String .class.getConstructors(),这个方法就会返回String类所有的构造方法,要用一个构造方法类的数组去装!要拿到具体哪一个构造方法的话,就用参数类型去区分String .class.getConstructor(StringBuffer。class),传进去相应类型的字节码就可以,这样就可以拿到参数类型为StringBuffer,的构造方法!构造方法可以得到自己所属的类,可以创建对应类的实例对象,可以得到它的访问修饰符!class。newInstance(),跟构造方法。newInstance()的区别,在于,前者是调用默认的,也就是无参数的构造方法,后者可以任意指定构造方法!



1 个回复

倒序浏览
自己写上一遍记忆深刻不少呀
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马