美文网首页java入门基础
反射机制(二)获取Class实例的三种方式

反射机制(二)获取Class实例的三种方式

作者: 无关风月oo | 来源:发表于2018-06-02 16:58 被阅读15次

获取Class实例

import java.util.Date;

//获取字节码对象(Class对象)
public class GetClassInstance {
    public static void main(String[] args) throws Exception {
//需求:获取java.util.Date类的字节码对象

//        方式一:使用class属性
        Class<java.util.Date> clz1 = java.util.Date.class;

//        方式二:通过对象的getClass方法来获取,getClass是Object类中的方法;返回次Object的运行时类
        java.util.Date date = new java.util.Date();
        Class<?> clz2 = date.getClass();

//        方式三:通过Class类中的静态方法forName(String className);
        Class clz3 =Class.forName("java.util.Date");

        System.out.println(clz1);
        System.out.println(clz2);
        System.out.println(clz3);

        System.out.println(clz1 == clz2);
        System.out.println(clz1 == clz3);
        System.out.println(clz3 == clz2);
        /*Console:
        class java.util.Date
        class java.util.Date
        class java.util.Date
        true
        true
        true
        */
    }
}

第三种使用最多,框架中大量使用;

九大内置的Class实例

思考一个问题:
在前面讲述了三种获取Class对象的方式,基本数据类型不能表示为对象(注意:包装类包装的是值),也就不能使用getClass()的方式,基本类型没有类名的概念,也就无法使用Class.forName()的方式,如何表示基本类型的字节码对象呢?

所有的数据类型都有class属性,其语法为:
Class clz = 数据类型.class ;

九大内置Class实例:

-JVM预先提供好的Class实例,分别为:
byte,short,int,long,float,double,char,boolean,void;
注意这里的void也是属于基本类的。


八大基本数据类型的包装类中,都有一个常量 :TYPE;用于返回该包装类对应基本类的字节码对象;
System.out.println(Integer.TYPE == int.class);//true

注意:Integer和int是不同的数据类型

System类中的identityHashCode()简单说明一下:
一个对象的identityHashCode能够始终和该对象的内部地址有一个相对应的关系,从这个角度来讲,它可以用于代表对象的引用地址。

public class IntClasses {
  public static void main(String[] args) {
    Class<Integer> a = int.class;
    Class<Integer> b = Integer.TYPE;
    Class<Integer> c = Integer.class;

    System.out.println(System.identityHashCode(a));
    System.out.println(System.identityHashCode(b));
    System.out.println(System.identityHashCode(c));
  }
}

示例输出(每次都是不同的,但前两个总是相同的,第三个实际上总是不同的,因为是JVM内置的):

1627674070
1627674070
1360875712

数组的Class实例

数组是引用数据类型,数组其实是对象;
-在Object类中开头有说明:
/*
Class {@code Object} is the root of the class hierarchy(等级体系 ).

  • Every class has {@code Object} as a superclass. All objects,
  • including arrays, implement the methods of this class.
    */
    --接口是一种特殊的类,也可以调用Object类中的方法;

如何表示数组的Class实例:

int[] arr1 = {1,2,3};

//方式一:数组类型.class;

Class<int[]> arr1Class = int[].class

//方式二:数组对象.getClass();

Class<int[]> arr2Class = arr.getClass();

System.out.println(arr1Class == arr2Class);
//true -比较的是否为同一份字节码;

//*注意:所有具有相同的维度和相同元素类型的数组共享同一份字节码对象,和元素没有关系!
//-Object类中有说明;
即:int[] arr2 = {4,5,6,7,8,9};
System.out.println(arr1.getClass() == arr2.getClass());//true 

Class与Object的区别

Class:描述所有的类型,所以在Class类中应该具有所有类型的相同方法;
Object:描述所有的对象,所以在Object类用应该具有所有对象的共同的方法;

相关文章

  • Java高级-反射

    15.1.Java反射机制概述 15.2.理解Class类并获取Class实例(重点) 用反射实现类的实例化,调用...

  • 反射机制(二)获取Class实例的三种方式

    获取Class实例 第三种使用最多,框架中大量使用; 九大内置的Class实例 思考一个问题:在前面讲述了三种获取...

  • 3 反射,代理

    反射 获取Class的实例的方式(前三种方式比较常用) 创建运行时对象 newInstance():调用此方法,创...

  • 反射机制

    反射:通过JVM运行中的class文件,获取相应对象的方法和属性的机制。 1、Class类三种生成方式: 1.1、...

  • java(代理和反射)

    反射和代理 反射 Class类和java.lang.reflect包 获取Class对象jdk提供了三种方式获取一...

  • 反射

    反射 class 获取class字节码对象的三种方式: //1、通过类.class Class cla...

  • Java 反射机制 (转)

    目录反射机制是什么反射机制能做什么反射机制的相关API通过一个对象获得完整的包名和类名实例化Class类对象获取一...

  • Java反射中获取Class对象三种方式的区别

    Java反射中获取Class有三种方式: new Object().getClass Object.class C...

  • Java 学习基础篇 ---- Java反射与泛型

    一、反射 通过Class实例获取 class 信息的方法称为反射(Reflection)。 (一) Class 类...

  • 反射

    反射必须依赖Class类字节码文件 获取Class对象三种方式1.类名.class String.class...

网友评论

    本文标题:反射机制(二)获取Class实例的三种方式

    本文链接:https://www.haomeiwen.com/subject/igfhsftx.html