java基础加强中反射

一、反射定义

    就是把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 对象是否表示一个基本类型或者数组类型等。在今后学习中,应学会熟记并运用这些知识,。

猜你喜欢

转载自blog.csdn.net/u011638706/article/details/40583365