1、java 使用Class对象来执行其RTTI。java 中每个类在编译后都会对应产生一个Class对象(更恰当地说是被保存在一个同名的.class文件中),甚至void和基本类型也都对应一个class对象。

jvm使用类加载器来将所需要的类动态的加载到JVM。所有的都是在第一次使用时动态加载到JVM中。当程序创建第一个对类的静态成员引用时,就加载这个类。构造器也是类的静态方法,即使没有static关键字,因此在使用new操作符创建新对象时也会被当做对类的静态成员的引用。

类加载其首先加载这个类的Class对象是否加载,未加载则查找相应.class文件。当然需要做一些验证。

  在加载Class时会执行其静态代码块。为了使用类而做的准备工作实际包含三个步骤:

  (1)加载,这是由类的加载器执行的。该步骤查找字节码,从字节码中创建一个Class对象。

  (2)连接,在连接阶段将验证类中的字节码,为静态域分配存储空间,解析这个类创建的对其他类的所有引用。

  (3)初始化,如果该类具有超类,则对其初始化,执行静态初始化器和静态代码块。

2、Class类有许多静态方法,例如forName(),在调用时,如果没有相应的类,也会加载。Class.forName(“ClassName”)也会返回一个名为ClassName的Class对象的引用。Class的newInstance()用于创建该类型的一个实例。

3、java 提供了另一种方法来产生对Class对象的引用,即使用类字面常量。例如MyClass.class。使用这个方法不仅安全而且更高效。但是该方法Class的初始化被延迟到了对静态方法或者非常数静态域的首次引用时才执行。

4、泛化的Class引用,直接的Class对象可以指向不同类型的Class对象,比如

Class intclass = int.class;
Class<Integer> genericIntClass = int.class;
genericIntClass=double.class;//ERROR

书中建议使用Class<? extends MyClass>

5、使用 instanceof 关键字判断实例的类型的代码。虽然Rat、Mutt等类型被保存在了Pet的list中但是仍然可以作为其自己的类型使用。java也提供了isInstance()方法来判断类的类型。

  

class Pet
{
protected String name;
public Pet()
{
name="this is Pet";
}
public Pet(String name)
{
this.name=name;
}
public String toString()
{
return "Pet";
}

public String hehePet()
{
return name;
}
}

class Dog extends Pet
{

public Dog()
{
super();
name="this is Dog";
}
public Dog(String name) {
super(name);
// TODO Auto-generated constructor stub
}
public String toString()
{
return "Dog";
}

public String heheDog()
{
return name;
}
}

class Mutt extends Pet
{
public Mutt()
{
super();
name="this is Mutt";
}
public Mutt(String name) {
super(name);
// TODO Auto-generated constructor stub
}
public String toString()
{
return "Mutt";
}
public String heheMutt()
{
return name;
}
}

class Rat extends Pet
{
public Rat()
{
super();
name="this is Rat";
}
public Rat(String name)
{
super(name);
}
public String toString()
{
return "Rat";
}
public String heheRat()
{
return name;
}
}

public class Main{

public static Pet getPet(Class<?extends Pet> type) throws InstantiationException, IllegalAccessException
{
return type.newInstance();
}
public static void main(String[] args)
{
List<Class<? extends Pet>> types = new ArrayList<Class<? extends Pet>>();
List<Pet> petlists = new ArrayList<Pet>();
/* try {
types.add((Class<? extends Pet>) Class.forName("com.Rat"));
types.add((Class<? extends Pet>) Class.forName("com.Mutt"));
types.add((Class<? extends Pet>) Class.forName("com.Dog"));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(types!=null&&!types.isEmpty())
{
for(Class<?extends Pet> type:types)
{
try {
petlists.add(getPet(type));
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}*/
petlists.add(new Pet());
petlists.add(new Rat());
petlists.add(new Mutt());
petlists.add(new Dog());
((Dog) petlists.get(2)).heheDog();
if(petlists!=null&&!petlists.isEmpty())
{
for(Pet pet:petlists)
{
if(pet instanceof Pet)
{
System.out.println("Pet "+pet.toString());
System.out.println(pet.hehePet());
}
if(pet instanceof Dog)
{
System.out.println("Dog "+pet.toString());
System.out.println(((Dog) pet).heheDog());
}
if(pet instanceof Rat)
{
System.out.println("Rat "+pet.toString());
System.out.println(((Rat) pet).heheRat());
}
if(pet instanceof Mutt)
{
System.out.println("Mutt "+pet.toString());
System.out.println(((Mutt) pet).heheMutt());
}
}
}
}
}

java RTTI笔记 之Class学习笔记(摘自java编程思想)的更多相关文章

  1. Java程序猿的JavaScript学习笔记(汇总文件夹)

    最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...

  2. Java程序猿的JavaScript学习笔记(8——jQuery选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  3. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  4. Java程序猿的JavaScript学习笔记(1——理念)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  5. Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  6. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  8. Java程序猿的JavaScript学习笔记(6——面向对象模拟)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  9. Java程序猿的JavaScript学习笔记(5——prototype和Object内置方法)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  10. 图灵学院JAVA互联网架构师专题学习笔记

    图灵学院JAVA互联网架构师专题学习笔记 下载链接:链接: https://pan.baidu.com/s/1xbxDzmnQudnYtMt5Ce1ONQ 密码: fbdj如果失效联系v:itit11 ...

随机推荐

  1. 数据库 SQL Server2012安装步骤详解

    这篇文章主要给大家讲解一下数据库SQL Server2012的安装步骤(若有雷同纯属巧合,还望谅解!) 在正式安装之前,我们需要进行两个设置: ① 首先需要关闭Windows防火墙,若不关闭,后续的安 ...

  2. Java 代码学习之数组的初始化

    我们都很熟悉Java中的数组,它具有查询快,增删慢的特点.但是通常我们自认为很了解它的用法,却容易忽略一些小细节.今天通过一段代码来简单了解数组初始化中的一些我们容易忽略的地方. package da ...

  3. Hibernate框架进阶(中篇)之多表关系

    导读 Hibernate进阶主要分为上中下三篇,本文是中篇,主要讲解Hibernate框架中多表关系的实现.我们知道多表关系有一对一.一对多(多对一)和多对多三种关系.而1对1关系一般合并为一个表处理 ...

  4. 基于百度地图SDK和Elasticsearch GEO查询的地理围栏分析系统(1)

    本文描述了一个系统,功能是评价和抽象地理围栏(Geo-fencing),以及监控和分析核心地理围栏中业务的表现. 技术栈:Spring-JQuery-百度地图WEB SDK 存储:Hive-Elast ...

  5. poj 2905 双向队列(待补充)

    Parallel Computer Simulator   Description Programs executed concurrently on a uniprocessor system ap ...

  6. java学习笔记之集合家族1

    集合 集合介绍: 由于数组中存放对象,对对象操作起来不方便.java中有一类容器,专门用来存储对象. 集合与数组的区别: 1.数组的长度固定的,而集合长度时可变的 2.数组只能储存同一类型的元素,而且 ...

  7. (win10 64位系统中)Visual Studio 2015+OpenCV 3.3.0环境搭建,100%成功

    (win10 64位系统中)Visual Studio 2015+OpenCV 3.3.0环境搭建,100%成功 1.下载opencv 官网http://opencv.org/下载windows版Op ...

  8. EventBus在Android中的简单使用

    EventBus是一个方便与Android中各组件通信的开源框架,开源地址;https://github.com/greenrobot/EventBus.EventBus功能非常强大 ,今天在做一个功 ...

  9. 黑马day16 jquery&amp;内容过滤选择器&amp;可见度选择器

    内容过滤选择器的过滤规则主要体如今它所包括的子元素和文本内容上 .:contains(text) 使用方法: $("div:contains('John')")    返回值  集 ...

  10. Python 安装 BeautifulSoup(Win7)

    准备材料: 1.Win7,已安装的 Python3.4.1 2.BeautifulSoup4.3.2安装包 安装办法: 1.打开cmd 2,进入BeautifulSoup的解压文件夹 3,执行 pyt ...