java RTTI笔记 之Class学习笔记(摘自java编程思想)
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编程思想)的更多相关文章
- Java程序猿的JavaScript学习笔记(汇总文件夹)
最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...
- Java程序猿的JavaScript学习笔记(8——jQuery选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(3——this/call/apply)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(1——理念)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(6——面向对象模拟)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(5——prototype和Object内置方法)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- 图灵学院JAVA互联网架构师专题学习笔记
图灵学院JAVA互联网架构师专题学习笔记 下载链接:链接: https://pan.baidu.com/s/1xbxDzmnQudnYtMt5Ce1ONQ 密码: fbdj如果失效联系v:itit11 ...
随机推荐
- 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)
前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种. 第一种是单例模式的类. 第二种是另外定义一个Service,直接通过Service来实现ftp的上 ...
- .NET作品集:linux下的博客程序
博客程序架构 本博客程序是博主11年的时候参考loachs小泥鳅博客内核开发的.net跨平台博客cms,距今已有6年多了,个人博客网站一直在用,虽然没有wordpress那么强大,但是当时在深究.ne ...
- 图片布局css
对于平时项目开发中,经常要展示图片.什么水平居中显示,垂直居中显示,水平或垂直居中显示...我们的发际线就是这样往后退的. 接下来要讲的就是对于各种图片布局的css实现(这里针对的是img标签的不会使 ...
- Eclipse背景颜色改动
Eclipse背景颜色改动: 操作界面默认颜色为白色. 对于我们长期使用电脑编程的人来说.白色非常刺激我们的眼睛,所以我常常会改变workspace的背景色.使眼睛舒服一些.设置方法例如以下: ...
- 【树状数组】POJ 2352 Stars
/** * @author johnsondu * @time 2015-8-22 * @type Binary Index Tree * ignore the coordinate of y and ...
- 通过案例学习 Secret - 每天5分钟玩转 Docker 容器技术(110)
在下面的例子中,我们会部署一个 WordPress 应用,WordPress 是流行的开源博客系统. 我们将创建一个 MySQL service,将密码保存到 secret 中.我们还会创建一个 Wo ...
- NIO相关基础篇三
转载请注明原创出处,谢谢! 说在前面 上篇NIO相关基础篇二,主要介绍了文件锁.以及比较关键的Selector,本篇继续NIO相关话题内容,主要谈谈一些Linux 网络 I/O模型.零拷贝等一些内容, ...
- 导入maven项目时出现 Version of Spring Facet could not be detected. 解决方法
问题出现在: 导入maven项目的时候,其中,我的这个maven项目是由Spring,Struts2,Mybatis搭建的. 问题截图: 即Spring的版本不能被检测到.此时需要做的就是找到spr ...
- Asp.Net Web API(四)
HttpResponseException-----HTTP响应异常 如果Web API控制器抛出一个未捕捉的异常,会发生什么呢?在默认情况下,大多数异常都会转换为一个带有状态码500的内部服务器错误 ...
- 《从Paxos到Zookeeper:分布式一致性原理与实践》【PDF】下载
内容简介 Paxos到Zookeeper分布式一致性原理与实践从分布式一致性的理论出发,向读者简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了Paxos和ZAB协议. ...