Java中Class类与RTTI
来源:互联网 发布:mac os x 10.9.5 编辑:程序博客网 时间:2024/06/11 21:29
…本人小白一枚,希望各位大侠批评指正^_^
RTTI
RTTI(Run Time Type Information),运行时类型信息
First : why?
Java运行时系统需要准确地知道每个对象实例的类型信息(属于哪一个类等等),于是将一个类的信息用另一个类包装起来,用于包装一个类的信息的类就是Class类。
Second : what?
首先抛出一些概念:
add1:什么是java运行时系统?
运行java应用程序所需的系统环境,可以大致理解为JVM(Java Virtual Machine).Java是一种典型的解释型语言,需要借助虚拟机来运行java编写的程序.当一个Java的源程序编写好后,将会被编译成字节码文件(.class文件),然后JVM就负责运行这些字节码文件.
add2:什么是类加载器(Class Loader)?
$1.类加载器: 顾名思义,负责把需要的类加载到JVM。(一旦程序需要用到某个类时,就通过类加载器将对应的.class文件从外存中调入)当一个类被加载时,就会创建一个Class对象,用于封存关于这个类的信息. $2.类加载器的类型: 1)引导类加载器(bootstrap class loader):加载 Java 的核心库。 2)扩展类加载器(extensions class loader):加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。 3)系统类加载器(system class loader):根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。 4)自定义类加载器:通过继承 java.lang.ClassLoader 类的方式实现自定义的类加载器。继承关系:引导类加载器<--扩展类加载器<--系统类加载器<--自定义类加载器
add3:什么是Class类?
$1.把它看做一种比较特殊的类,用于保存一个类的信息,比如说一个类的名字啊、方法啊、父类是谁啊……等等。这个类只能由JVM自动创建,自己是不可能创建一个Class对象的。$2.这个类常用的方法? 1)public static Class<?> forName(String className):参数是一个类的名字(package path),返回该类的Class对象引用。 2)public T newInstance():创建此 Class 对象所表示的类的一个新实例。 3)public native Class getSuperclass():获取类的父类 4)public ClassLoader getClassLoader() :获得类的类加载器。 5)public String getName() :获取类或接口的名字。enum为类,annotation为接口。 6)public Constructor<?>[] getConstructors() :获得所有的构造函数。 7)public Field[] getFields() :获得域成员数组。 8)public Method[] getMethods() :获得方法。$3.特殊用法:虚拟构造器 我只拿到一个类的名字,但是我就要准确地创建这个类的一个实例。 举个例子:
package test1;public class Apple{ static{ System.out.println("hello,I am an apple!"); } public static void main(String[] args){ try{ Apple apple = (Apple)Class.forName("test1.Apple").newInstance(); }catch(Exception e){ e.printStackTrace(); } }}
$4.泛化 1)指明Class对象引用的类型,可以强迫编译器进行额外的类型检查 Class<Apple> c = Apple.class; 2)区分两种效果看似相同的写法 Class c = Apple.class; Class<?> c = Apple.class;//相比较上面那种写法,该写法明确表示:老子是特地使用非具体类型的Class引用 3)用Class引用指向基类的任何子类的class对象 Class<? extends Number> c = int.class; 4)用子类Class对象构建父类Class对象 Class Parent{} //父类 Class Child extends Parent{} //子类 Class<Child> c = Child.class; Class<? super Child> c2 = c.getSuperclass();
Third : how?
现在来讲讲怎么回事
$1.Java采用动态加载类的策略,只有一个类被需要时才会被加载.$2.当第一次调用一个类的静态成员时,类加载器就会加载这个类,并且自动创建一个Class对象,把类的信息放进去. 初始化Class对象,具体讲讲三个步骤: 1)加载:由Class Loader查找.class文件,并创建Class对象; 2)链接:验证字节码文件,为静态分配存储空间,解析对其他对象的引用; 3)初始化:初始化父类,执行静态初始化器和静态初始化块.$3.所有这个类的所有对象共享一个Class对象.$4.三种方法获得Class对象(以上面的Apple类为例): 1)获取类的静态成员变量class Class c = Apple.class; 2)调用对象的getClass()方法,返回该对象对应的一个Class对象 Class c = apple.getClass(); 3) 调用Class类的静态方法forName(); Class c =Class.forName("test1.Apple");
阅读全文
0 0
- Java中Class类与RTTI
- java 运行时类型识别(RTTI) - 1 - Class与instanceof
- java 运行时类型识别(RTTI) - 1 - Class与instanceof
- java 类型信息(RTTI) 中 Class对象的理解
- Java RTTI(类型信息)(.class 类对象)
- Java RTTI与反射
- java-----RTTI与反射
- Java RTTI与反射
- Java RTTI与反射
- Java RTTI与反射
- 关于C++中RTTI与Java中RTTI的对比和使用
- Class RTTI
- 【Class】Java中类、实例与Class对象
- JAVA中类、实例与Class对象
- JAVA中类、实例与Class对象
- JAVA中类、实例与Class对象
- C++中RTTI与dynamic_cast
- Java中的RTTI与反射
- Driver 分层的思想 -- Linux Kernel 内核实现欣赏
- Carbide编辑CP代码中的环境配置及编译
- @EnableWebMvc 与 @EnableAutoConfiguration 的关系
- EU4-33: Sloving an employee problem
- 浅谈树链剖分
- Java中Class类与RTTI
- 手机的唯一识别符
- 第17课
- POJ 1273 Drainage Ditches
- Angular 2基础(一) 环境搭建
- matlab 怎么在直角坐标系中添加最值得数值
- 过滤器和拦截器的区别
- 信息安全第三篇(网络传输的加密与解密)
- C++中的四种运算符转化及不同点: