Java中Class类工作原理详解
ass对象
Class对象包含了与类相关的信息。事实上,Class对象就是用来创建类的所有的"普通"对象的。
类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生一个Class对象(恰当地说,是被保存在一个同名 的。class文件中)。在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机(JVM)首先检查这个类的Class对象是否已经加载。 如果尚未加载,JVM就会根据类名查找。class文件,并将其载入。
一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。看下面示例。
va
package mple;
class Candy {
static {
intln("Loading Candy");
}
}
class Gum {
static {
intln("Loading Gum");
}
}
class Cookie {
static {
intln("Loading Cookie");
}
}
public class SweetShop {
public static void main(String[] args) {
intln("inside main");
new Candy();
intln("After creating Candy");
try {
rName("m");
} catch (ClassNotFoundException e) {
intln("Couldn't find Gum");
}
intln("After rName("Gum")");
new Cookie();
intln("After creating Cookie");
}
}
结果:
inside main
Loading Candy
After creating Candy
Loading Gum
After rName("Gum")
Loading Cookie
After creating Cookie
2.获取Class实例的三种方式
1)利用对象调用getClass()方法获取该对象的Class实例。
2)使用Class类的静态方法forName(),用类的名字获取一个Class实例。
3)运用。class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用。TYPE来获取相对应的基本数据类型的Class实例。
rName
上面的示例中:
rName("m");
这个方法是Class类(所有Class对象都属于这个类)的一个static成员。Class对象就和其它对象一样,我们可以获取并操作它的引用。 forName()是取得Class对象的引用的一种方法。它是用一个包含目标类的文本名的String作输入参数,返回的是一个Class对象的引用。
4.类字面常量
Java还提供了另一种方法来生成对Class对象的引用,即使用"类字面常量"。对上述程序来说,可以是:
ass;
5.关键字instanceof
关键字instanceof返回一个布尔值,判断是不是某个特定类型的实例。
if(x instanceof Dog) ((Dog)x)。bark();
6.获取Class实例
package mple;
class Point {
int x, y;
}
class ClassTest {
public static void main(String[] args) {
Point pt = new Point();
Class c1 = tClass();
intln(tName());
try {
Class c2 = rName("int");
intln(tName());
} catch (Exception e) {
intStackTrace();
}
Class c3 = ass;
intln(tName());
Class c4 = ass;
intln(tName());
Class c5 = PE;
intln(tName());
Class c6 = ass;
intln(tName());
}
}
结果:
int
int
int
int
int
eger
ass的其他方法
1)wInstance()使用所选的Class对象生成该类的新实例。它调用了缺省(无参数)的类构造器生成新的对象。所以使用 newInstance()创建的类必须有一个缺省构造器。对于newInstance()来说,可以在原先没有任何对象存在的情况下,使用它创建一个新 的对象。
利用newInstance()实例化一个对象:
package mple;
class Point {
static {
intln("Loading Point");
}
int x, y;
}
class ClassTest {
public static void main(String[] args) {
try {
Class c = rName("int");
Point pt = (Point) wInstance();
} catch (Exception e) {
intStackTrace();
}
}
}
结果:
Loading Point
2)Instance()方法提供了一种动态地调用instanceof运算符的途径。
3)tInterfaces()方法返回Class对象的数组,这些对象代表的是某个Class对象所包含的接口。
4)如果有一个Class对象,那么就可以通过getSuperclass()获取它的直接基类。这个方法自然也是返回一个Class引用,所以可以进一步查询其基类。这意味着在运行时,可以找到一个对象完整的类层次结构。
5)Class类支持反射的概念,Java附带的库flect包含了Field、Method以及Constructor类 (每个类都实现了Member接口)。这些类型的对象是由JVM在运行时创建的,用以表示未知类里对应的成员。这样可以使用Constructor创建新 的对象,用get()和set()方法读取和修改与Field对象关联的字段,用invoke()方法调用与Method对象关联的方法。另外,还可以调 用getFields()、getMethods、getConstrucotrs()方法,返回表示字段、方法以及构造器的对象的数组。
8.利用反射API察看未知类的构造方法与方法
package mple;
import nstructor;
import thod;
class Point {
static {
intln("Loading Point");
}
int x, y;
void output() {
intln("x=" + x + "," + "y=" + y);
}
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class ClassTest {
public static void main(String[] args) {
try {
Class c = rName("int");
Constructor[] cons = tDeclaredConstructors();
for (int i = 0; i < ngth; i++)// 返回所有声明的构造方法
{
intln(cons[i]);
}
Method[] ms = tDeclaredMethods();
for (int i = 0; i < ngth; i++)// 返回所有声明的方法
{
intln(ms[i]);
}
} catch (Exception e) {
intStackTrace();
}
}
}
结果:
Loading Point
int(int,int)
void tput()
9.动态调用一个类的实例(完全没有出现point这个名字)
package mple;
import nstructor;
import thod;
class Point {
static {
intln("Loading Point");
}
int x, y;
void output() {
intln("x=" + x + "," + "y=" + y);
}
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class ClassTest {
public static void main(String[] args) {
try {
Class c = rName("int");
Constructor[] cons = tDeclaredConstructors();
Class[] params = cons[0].getParameterTypes();// 察看构造器的参数信息
Object[] paramValues = new Object[ngth];// 构建数组传递参数
for (int i = 0; i < ngth; i++) {
if (params[i].isPrimitive())// 判断class对象表示是否是基本数据类型
{
paramValues[i] = new Integer(i);
}
}
Object o = cons[0].newInstance(paramValues);// 创建一个对象的实例
Method[] ms = tDeclaredMethods();// 调用方法
ms[0].invoke(o, null);// 用指定的参数调用(output方法没有参数,null)
} catch (Exception e) {
intStackTrace();
}
}
}
结果:
Loading Point
x=0,y=1
- 工信部部长工业力争全年增长10定时插座档案袋粮机配件立体车库欧式插座Frc
- 亚洲市场ABS现货价降低25美元供电器铸造合金柿子保险杠防雷管Frc
- 无缝钢管生产工艺亳州技术转让风量计废纸悬臂货架Frc
- 1月11日国内环氧氯丙烷市场早间提示淮北光碟机印花加工闪存卡电冰箱Frc
- 国际瓦楞纸加工业总体发展状况腰靠桌面玩具保健鞋电机轴承花鲢养殖Frc
- 赢创集团将再投亿元搏杀中国市场金鱼养殖绳索筒灯写字台弹簧Frc
- 华北工控高交会产品嵌入式迷你电脑BIS换色器珠海波纹手轮抗氧剂电源Frc
- 更新包装理念构建节约型社会0专业叉车烧烤蔬果条钣金加工房产物业Frc
- 沙伯基础助KKL新推Verton复合材料螺尾锥销加料机真空开关搬迁品牌服装Frc
- 多家公司CEO吐槽中国光伏市场关键是如何不倒翁分离二手锯床液压车床内墙瓷砖Frc