设为首页 加入收藏

TOP

Java中Class与Object及反射机制
2014-11-24 07:43:31 来源: 作者: 【 】 浏览:1
Tags:Java Class Object 反射 机制

平时看代码时,总是碰到这些即熟悉又陌生的名次,每天都与他们相见,但见面后又似曾没有任何的交集,所以今天我就来认识下这两个江湖侠客的背景:


CLASS


在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息


获取Class实例的三种方式:


(1)利用对象调用getClass()方法获取该对象的Class实例;


(2)使用Class类的静态方法forName(),用类的名字获取一个Class实例(staticClass forName(String className) Returns the Classobject associated with the class or interface with the given stringname. );


(3)运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例


在newInstance()调用类中缺省的构造方法 ObjectnewInstance()(可在不知该类的名字的时候,常见这个类的实例) Creates a new instance of the class represented by this Classobject.


在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象


Class对象的生成方式如下:


1.Class.forName("类名字符串") (注意:类名字符串必须是全称,包名+类名);


2.类名.class;


3.实例对象.getClass();


package baseJava;


public class TestClass {


/**
* @param args
* 2013-4-11 上午10:30:05
* @author zhao_xingcai
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {

//测试Class.forName()
Class classForName = Class.forName("baseJava.TestClass");
System.out.println("classForName : [" + classForName + "]");

//测试类名.class
Class classForName2 = TestClass.class;
System.out.println("classForName2 : [" + classForName2 + "]");

//测试Object.getClass()
TestClass newInstance = new TestClass();
System.out.println("newInstance : [" + newInstance.getClass() + "]");

//hashCode指的是内存的地址
System.out.println("newInstanceHashCode : [" + newInstance.hashCode() + "]");

//toString代表该对象的一个字符串
//格式:this.getClass().getName() + '@' + Integer.toHexString(hashCode())
System.out.println("newInstanceToString : [" + newInstance.toString() + "]");


}catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/*
* 构造函数
*/
public TestClass() {
System.out.println(" 构造函数");
}

/*
* 静态的参数初始化
*/
static {
System.out.println("静态的参数初始化 ");
}

/*
* 非静态的参数初始化
*/
{
System.out.println("非静态的参数初始化 ");
}


}


运行结果如下:


静态的参数初始化


classForName : [class baseJava.TestClass]


classForName2 : [class baseJava.TestClass]


非静态的参数初始化


构造函数


newInstance : [class baseJava.TestClass]


newInstanceHashCode : [12677476]


newInstanceToString : [baseJava.TestClass@c17164]


也就是说:


三种方法生成CLASS对象是一样的,因为CLASS在JVM的名称是一样的,但是三种生成的方法略有不同:静态的方法属性初始化,是在加载类的时候初始化。而非静态方法属性初始化,是new类实例对象的时候加载。当我们编写一个新的JAVA类时,JVM就会帮我们编译成CLASS对象,存放在同名的.class文件中,在运行时,当需要生成这个类的对象时,JVM就会检查此类是否装载到内存中,会没有装载,就把.class装载到内存中,若装载过,则根据.class生成对象。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇ARM指令集及混合编程 下一篇Unity3D--定义摄像机的投影矩阵

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)
·[ Linux运维学习 ] (2025-12-26 02:52:27)
·HTTPS 详解一:附带 (2025-12-26 02:20:37)
·TCP/IP协议到底在讲 (2025-12-26 02:20:34)