码迷,mamicode.com
首页 > 编程语言 > 详细

Java Class类

时间:2016-07-20 22:44:05      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

Java Class类

@author ixenos

 摘要:构造Class对象的三种方式、Class对象构造对应类型对象的三种方式

 

 

  

 

构造Class对象的三种方式


 0.前言

为了使用类而做的准备工作包括三个步骤:

1)加载类加载器查找字节码(一般在classpath中找),从字节码创建一个Class对象

2)链接:验证字节码,为静态域(只是static修饰的域,不包含static final )分配存储空间,解析此类对其他类的所有引用

3)初始化:若该类有超类,对其初始化,执行静态初始化器(构造器算一个)和静态初始化块

-----------------------------

***static final int = 47 是编译期常量,不需要对类进行初始化就可以读取

***static final int = Random.nextInt(100)  是运行时常量,这种一般要在对象创建后才会运行,超过初始化的阶段了!

***static int = 47 是静态域而已,不是常量,更不是编译期常量

 

1.Class类的forName静态方法(自动初始化)

只知道对应类型名时,使用Class.forName(String name) 动态生成Class<String>对象,

 

2.Object类对象自带getClass方法(已经初始化)

持有对应类型对象的引用时,使用对象的getClass()(属于根类Object的一部分),如new Integer(1).getClass()将返回Integer.class,而此时的类型对象也必定是在运行中了,所以已经初始化

 

3.使用类字面常量(不会自动初始化)

例如 Fancy.class、String.class、Integer.TYPE

1)类字面常量应用于:普通类(包含包装类哟)、接口、数组、基本数据类型

***基本数据类型 使用标准字段TYPE,这是个指向基本数据类型的Class对象的引用

***例如int.class等价于Integer.TYPE,但是不等价于Integer.class

2)使用".class"来创建Class对象的引用时,不会自动地初始化该Class对象。

为什么不会自动初始化呢?由补充内容可知初始化被延迟到了对静态(static)方法(构造器等同于隐式静态)或者非常数(final)静态域进行首次引用时才执行,而引用类字面常量在运行时只是到了加载和链接的阶段

 

 

Class对象构造对应类型对象的三种方式


无参构造 

1.Class对象的newInstance方法(不能传递参数)

先获得Class对象,然后通过Class对象的newInstance方法直接生成

1 Class<?> classType = String.class;
2 Object obj = classType.newInstance();

 

 

2.Contructor对象的newInstance方法(不填参数就和1.一样)

先获得Class对象,然后通过Class对象生成Constructor对象,通过Constructor对象的newInstance方法生成

1 Class<?> classType = Customer.class;
2 //Class[]数组对应形参类型、个数,这里为空
3 Constructor cons = classType.getConstructor(new Class[]{}); 
4 //Object[]数组对应传入的实参的类型、个数,这里为空
5 Object obj = cons.newInstance(new Object[]{});

 

 

含参构造

3.Contructor对象的newInstance方法(填入形参类型和实际参数)

先获得Class对象,然后通过Class对象生成Constructor对象,通过Constructor对象的newInstance方法生成

1 Class<?> classType = Customer.class;
2 //Class[]数组对应形参类型、个数,这里为Integer.TYPE,Xenos.class,String.class
3 Constructor cons = classType.getConstructor(new Class[]{Integer.TYPE, Xenos.class, String.class}); 
4 //Object[]数组对应传入的实参的类型、个数,这里为1, new Xenos(), "Think"
5 Object obj = cons.newInstance(new Object[]{1, new Xenos(), "Think"});

 

Java Class类

标签:

原文地址:http://www.cnblogs.com/ixenos/p/5689878.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!