您的位置:首页 > 职场人生

黑马程序员------java基础加强中反射

2014-10-29 11:08 375 查看
          

              ------Java培训、Android训、iOS培训、Net培训、期待与您交流!------

一、反射定义

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

二、获得Class对象
如何得到各个字节码对应的实例对象?
每个类被加载后,系统会为该类生成对应的Class对象,通过Class对象可以访问到JVM中的这个类,3种方式:
1、调用某个类的class属性获取Class对象,如Date.class会返回Date类对应的Class对象(其实就是得到一个类的一份字节码文件);
2、使用Class类的forName(String className)静态方法,className表示全限定名;如String的全限定名:java.lang.String;
3、调用某个对象的getClass()方法。该方法属于Object类;
Class<?>clz = new Date().getClass();
 代码实例:
public class ClassDemo1 {
    public static void main(String[] args)throws Exception {
       //获得Class对象的方法(三种)
       //一:调用属性
       Class<String> c = String.class;
       System.out.println(c);//打印结果:class java.lang.String         
       //String.class就表示JVM中一份表示String类的字节码
       Class<String> c2 = String.class;
       System.out.println(c == c2);//true都是String类的字节码  一个类在虚拟机中只有一份字节码;
      
       //二:使用forName()方法
       //Class cla = Class.forName("String");//ERROR,
       Class<String> cla =(Class<String>)Class.forName("java.lang.String");
      //必须用上全限定名,否则报错
       System.out.println(c == cla);//true
      
       //三:利用对象调用Object的getClass方法;
       Class c3 = new String().getClass();
       System.out.println(c == c3);//ture
    }
}
 
三、九个预定义Class对象
 
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void通过class属性也表示为 Class 对象;
Class类中boolean isPrimitive() :判定指定的 Class 对象是否表示一个基本类型。
包装类和Void类的静态TYPE字段;
Integer.TYPE == int.class ;         
Integer.class == int.class;             
 数组类型的Class实例对象:
Class<String[]> clz = String[].class;
数组的Class对象如何比较是否相等? 数组的维数和数组的类型;
Class类中 boolean isArray() :判定此 Class 对象是否表示一个数组类型。
 代码实现
public class PreClassDemo2 {
    public static void main(String[] args) {
      
       Class<?> in = int.class;
       System.out.println(in);//int
       Class<?> in2 = Integer.class;
      
//包装类都有一个常量TYPE,用来表示其基本数据类型的字节码
       Class<?> in3 = Integer.TYPE;
      
       System.out.println(in2);//class java.lang.Integer
       System.out.println(in3);//int
       System.out.println(in3 == in);
       //true包装类都有一个常量TYPE,用来表示其基本数据类型的字节码,所以这里会相等!
       System.out.println(in3 == in2);//false
       Class<String[]> s = String [].class;
       Class<int[]> i =
int
[].class;
       //System.out.println(i ==s);//编译根本就通过不了,一个是int,一个是String
    }
    //这两个自定义的方法是可以的,一个int,一个Integer//包装类与基本数据类型的字节码是不一样的
    public void show(int i){}
    public void show(Integer i){}
}

四、总结

    通过上面内容的学习,了解了反射的定义及其含义,学会了三种可以得到各个字节码对应的实例对象(Class类型)(1)  类名.class,例如,System.class(2)对象.getClass(),例如,newDate().getClass();

(3)Class.forName(“类名”),例如:Class.forName(“java.util.Date”);但是在平常运用中,获取Class对象最常用的是利用属性的方法。了解了九种预定义的Class对象,学会了判定指定的 Class 对象是否表示一个基本类型或者数组类型等。在今后学习中,应学会熟记并运用这些知识,。

 
            ------Java培训、Android训、iOS培训、Net培训、期待与您交流!------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  黑马程序员 反射
相关文章推荐