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 ...
随机推荐
- Java反射机制(创建Class对象的三种方式)
1:SUN提供的反射机制的类: java.lang.Class<T> java.lang.reflect.Constructor<T> java.lang.reflect.Fi ...
- codeforces 893B Beautiful Divisors 打表
893B Beautiful Divisors 思路: 打表 代码: #include <bits/stdc++.h> using namespace std; #define _for( ...
- ABAP CDS Table Function介绍与示例
Core data services(以下简称CDS)可以指两样东西,一个是HANA CDS,一个是ABAP CDS. 如我们所知,HANA CDS只支持HANA数据库,ABAP CDS理论上支持多种 ...
- 再说Postgres中的高速缓存(cache)
表的模式信息存放在系统表中,因此要访问表,就需要首先在系统表中取得表的模式信息.对于一个PostgreSQL系统来说,对于系统表和普通表模式的访问是非常频繁的.为了提高这些访问的效率,PostgreS ...
- Python爬虫(二十一)_Selenium与PhantomJS
本章将介绍使用Selenium和PhantomJS两种工具用来加载动态数据,更多内容请参考:Python学习指南 Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试 ...
- 巧用第三方高速开发Android App 热门第三方SDK及框架
巧用第三方高速开发Android App 热门第三方SDK及框架 历经大半年的时间,最终是把这门课程给录制出来了,也就在今天,正式在慕课网上上线了 项目地址:巧用第三方高速开发Android App ...
- 赵雅智:service与訪问者之间进行通信,数据交换
服务类 中间人:service服务中的bind对象 创建中间人并通过onBinder方法的return暴露出去 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...
- Unity打包android的apk与数据包.obb分离和apk签名
那么,通过以上图片.我相信大多数人已经知道怎么创建了,apk签名比較简单,假设之前没有签名文件.那么选择图中的Create New Keystore然后在以下两个password框中输入passwor ...
- ZOJ 3890 Wumpus
Wumpus Time Limit: 2 Seconds Memory Limit: 65536 KB One day Leon finds a very classic game call ...
- Android View动画效果—透明效果,旋转效果(二)
一:动画效果 方法一:动画效果用AlphaAnimation类.直接加入 AlphaAnimation aa = new AlphaAnimation(0,1); //设置透明度 aa.setDura ...