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 ...
随机推荐
- POJ2251-Dungeon Master
题意:给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层的地图,相同RC坐标处是连 ...
- 垃圾陷阱洛谷dp
题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想把垃圾堆起来,等到 ...
- mac ox下android 通过battery-historian进行电量分析
简单介绍下如何用battery-historian进行电量分析,因为battery-hostorian是基于go语言的框架,所以需要安装go 1.安装go 2.配置go环境变量到.bash_profi ...
- BIRT实现组内跨行计算
问题来源:http://developer.actuate.com/community/forum/index.php?/topic/36160-dealing-with-previous-rows- ...
- 柯塔娜(Cortana):从科幻虚构到真实人生
依照商业法理.7月29日.随着Win10公布的东风."小娜"与"小冰"两姊妹相会于中国北京. 在"小娜"眼中,"小冰"仅 ...
- plsql本机不安装数据库连接远程数据库
用PL/SQL连接oracle数据库,不管是本地的还是远程的,一般都需要安装oracle客户端 如何达到不安装oracle客户端,又能使用PL/SQL工具? 1. oracle官网提供了i ...
- MVC(二)
一: 在新接触MVC的时候可以先使用VS建一个MVC项目(不是空项目哟),MVC特别人性化的建一个示例,展示了MVC项目的基本组成.如下: App_Data 数据库文件,需根据数据库变动而变更. Ap ...
- springboot小技巧(转)
一些springboot小技巧.小知识点 初始化数据 我们在做测试的时候经常需要初始化导入一些数据,如何来处理呢?会有两种选择,一种是使用Jpa,另外一种是Spring JDBC.两种方式各有区别下面 ...
- CSS之clearfix清除浮动
.clear { clear: both; height: 0; overflow: hidden; display: block; line-height: 0 } .clearfix:afte ...
- Java I/O---序列化接口Serializable
1.JDK API 中关于Serializable的描述 public interface Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能.未实 ...