java类型信息

简介

运行时类型信息可以在程序运行时发现和适应类型信息,使你从只能在编译期执行面向类型的操作的禁锢中解脱出来。
java是如何让我们在运行时识别对象和类型信息的呢?两种方式:

  1. 传统的“RTTI”,他假定我们在编译时已经知道了所有的类型
  2. 反射,允许在运行时发现和使用类的信息
    总结:反射是RTTI发展产生的概念和技术,多态是隐式地利用RTTI,反射则是显式地使用RTTI。

1.RTTI

RTTI(Run-Time Type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。这个概念是来自C++的。

2.Class< T >类

每编译了一个新类就会产生一个Class对象(更恰当地说,是被保存在一个同名的.class文件中),jvm使用“类加载器”来生成这个Class类的对象,这个类的Class对象会被放入内存,这个类的Class对象用来创建这个类的所有对象。关于类加载器的运行和加载顺序本文先不做详细描述。
java.lang.Class< T >

/**
 * Instances of the class {@code Class} represent classes and
 * interfaces in a running Java application.  An enum is a kind of
 * class and an annotation is a kind of interface.  Every array also
 * belongs to a class that is reflected as a {@code Class} object
 * that is shared by all arrays with the same element type and number
 * of dimensions.  The primitive Java types ({@code boolean},
 * {@code byte}, {@code char}, {@code short},
 * {@code int}, {@code long}, {@code float}, and
 * {@code double}), and the keyword {@code void} are also
 * represented as {@code Class} objects.
*
 *
{@code Class} has no public constructor. Instead {@code Class}
 * objects are constructed automatically by the Java Virtual Machine as classes
 * are loaded and by calls to the {@code defineClass} method in the class
 * loader.

在正在运行的java程序中class的实例代表 类 和 接口。enum是类的一种,annotation是接口的一种。数组也是一种类。基础java类型也是一个类对象({@code boolean},{@code byte}, {@code char}, {@code short}, {@code int}, {@code long}, {@code float}, and {@code double}),关键字{@code void}也是类对象。
Class类没有公开的构造函数,是有jvm自动调用类加载器中的 {@code defineClass}方法构造的。

Class描述的是类的信息

1.如何获取一个类的Class

  1. 类名.class
  2. Class.forName(全限定名)
  3. object.getClass()
Class class1=Reflect.class;
        System.out.println(class1);//class com.fcc.jdk8api.core.reflect.Reflect
        Class class2=new Reflect().getClass();
        System.out.println(class2);//class com.fcc.jdk8api.core.reflect.Reflect
        Class class3=Class.forName("java.lang.Class");//class java.lang.Class
        System.out.println(class3);
        System.out.println(class2.getName());//com.fcc.jdk8api.core.reflect.Reflect
        System.out.println(class1==class2);//true
  1. ClassLoader.getSystemClassLoader().loadClass(“com.my.test.Hello”)

instanceof与Class的等价性

public static void test(){
        Apple apple=new Apple();
        System.out.println(Apple.class==apple.getClass());//true
        System.out.println(Apple.class.equals(apple.getClass()));//true
        System.out.println(apple instanceof Apple);//true
        System.out.println(Apple.class.isInstance(apple));//true
        System.out.println(apple.getClass().isInstance(apple));//true
    }
发布了313 篇原创文章 · 获赞 75 · 访问量 56万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览