Class对象和反射
1.class对象
在java中一切都是对象,从某种意义上,java中的对象可以分为:实例对象和Class对象。实例对象通过new关键得到,那么Class对象呢?Class对象无法通过new关键字获取,在类加载的过程中,JVM生成一个与加载的字节码文件相关的class对象。通过类名可以获取对应Class对象。class对象主要用来对应类的所有对象。java程序在运行之前并未完全加载,各个类只在需要的时候才将该类加载进内存,生成对应的class对象。
所有的类都是在对其第一次使用的时候,动态加载到JVM中,当程序创建第一个对类静态成员的引用的时候,就会加载这个。使用new创建类的对象的也会被当做是对类静态成员的引用。因此java程序在它开始运行之前并非被完全加载,其各个部分是在必须的时候才加载。一旦某个类的Class对象被载入内存,它就用来创建这个类的所有的对象。如下面程序所示:
class Test1{
static{
System.out.println("loading1");
} }
class Test2{
static{
System.out.println("loading2");
} }
class Test3{
static{
System.out.println("loading3");
} }
public class Demo {
public static void main(String[] args) {
//new Test1();
Class clz = Test1.class;//注意Class clz = Test1.class;,不会触发静态块的执行,即不会自动初始化该Class对象
try { Class.forName("Test2");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
new Test3();
} }
输出结果:
loading1
loading2
loading3
2.Class对象的获取
Class对象是jvm用来保存对象实例对象的相关信息的,除此之外,我们完全可以把Class对象看成一般的实例对象,事实上所有的Class对象都是类Class的实例。获取Class对象主要有三种方式:
/**
* 获取Class对象的三种方式
*/
public class Demo{
public static void main(String[] args){
//1.通过实例对象获取class对象
Demo demo = new Demo();
Class clsdemo = demo.getClass(); //2.通过Class的静态方法forName
try {
Class clsdemo2 = Class.forName("Demo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} //3.通过类名和class关键字获取
Class clsdemo3 = Demo.class;
}
}
3.Class对象的使用和反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。通过反射机制来访问一个类java对象的属性,方法,甚至我们可以轻易改变一个私有成员。java反射是基于Class类和java.lang.Reflect类库。反射机制使得我们可以创建一个编译时完全未知的对象,并调用这个对象的方法。
public class Demo{
public static void main(String[] args){ Test test = new Test();
System.out.println(test.getClass()==Test.class);//一个类对应的class对象在内存中是唯一的 Class cls = Test.class;//字节码文件加载进内存,生成class对象,但是不会进行相关的初始化工作,不引起静态块的执行
try { Field [] fields = cls.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
Method [] methods = cls.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
class Test{
public static int count=0;
private int age=20;
public String name="xm";
static{
System.out.println("类被加载");
}
public void test(){
System.out.println("sss");
}
private void call(){
System.out.println("hi");
}
}
类被加载
true
public static int com.test.demo.Test.count
private int com.test.demo.Test.age
public java.lang.String com.test.demo.Test.name
public void com.test.demo.Test.test()
private void com.test.demo.Test.call()
4.泛化的Class引用
Class引用总是指向某个Class对象,它可以制造实例,并包含可以作用于这些实例的所有方法代码,且包含该类的静态成员,因此Class引用表示的就是它指向的对象的确切类型,而该对象便是Class类的一个对象。class引用可泛化。通过泛型语法,可以让编译器强制的执行额外的类型检查。如果希望放松些限制,可以使用通配符?,表示“任何事物”,如Class<?> intClass = int.class;在java SE5中,Class<?>优于平凡的Class.如下:
public class Demo {
public static void main(String[] args) {
Class intClass = int.class;
Class<Integer> integerClass = int.class;
integerClass = Integer.class;
Class<?> integerClz = Integer.class;
} }
Class对象和反射的更多相关文章
- java中复制对象通过反射或序列化
在使用缓存读取数据后修改发现缓存被修改.于是找了下复制对象的方法. 关于对象克隆 按我的理解,对象是包含引用+数据.通常变量复制都是将引用传递过去.比如: Person p1 = new Person ...
- Java基础 -- 深入理解Java类型信息(Class对象)与反射机制
一 RTTI概念 认识Claa对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RT ...
- Class对象即反射
Class对象 当ClassLoader加载一个class文件到JVM的时候,会自动创建一个该类的Class对象,并且这个对象是唯一的,后续要创建这个类的任何实例,都会根据这个Class对象来创建.因 ...
- xml 转换成对象(采用反射机制对对对象属性赋值)
/// <summary> /// 采用反射机制对对对象属性赋值 /// </summary> /// <param name="node">& ...
- python------面向对象进阶反射详解(重点)
一.反射 通过字符串映射或者修改程序运行时的状态,属性,或者方法. 1.getattr(object,name,default=None) 2.hasattr(object,name) 3.setat ...
- Class对象、反射机制、获取Constructor构造方法
1.Class对象的三种创建方法(Class首字母大写) public class Demo { public static void main(String[] args){ Object obj= ...
- python全栈开发day23-面向对象高级:反射(getattr、hasattr、setattr、delattr)、__call__、__len__、__str__、__repr__、__hash__、__eq__、isinstance、issubclass
一.今日内容总结 1.反射 使用字符串数据类型的变量名来操作一个变量的值. #使用反射获取某个命名空间中的值, #需要 #有一个变量指向这个命名空间 #字符串数据类型的名字 #再使用getattr获取 ...
- Java基础之深入理解Class对象与反射机制
深入理解Class对象 RRIT及Class对象的概念 RRIT(Run-Time Type Identification)运行时类型识别.在<Thinking in Java>一书第十四 ...
- PHP的序列化、对象、反射、异常与错误
1. 怎么理解php里面的序列化与反序列化? 序列化是将对象转换为字节流.反序列化就是将流转换为对象. 这两个过程结合起来,可以轻松地存储和传输数据,在网络中可以做到跨平台.快速传输. 两种序列化方式 ...
随机推荐
- 【转】android布局--Android fill_parent、wrap_content和match_parent的区别
三个属性都用来适应视图的水平或垂直大小,一个以视图的内容或尺寸为基础的布局比精确地指定视图范围更加方便. 1)fill_parent 设置一个构件的布局为fill_parent将强制性地使构件扩展,以 ...
- android获取传感器数据
传感器获取数据的频率: https://blog.csdn.net/huangbiao86/article/details/6745933 SensorManager.SENSOR_DELAY_GAM ...
- .clone事件当你克隆的时候,DOM节点是克隆出来了,但是克隆出来的节点不能运行时事件 ...
解决办法如下在clone()里面加个参数true,即可完成事件的植入.即:.clone(true).clone( [ withDataAndEvents ], [ deepWithDataAndEve ...
- atoi简析
原文链接 atoi()函数的功能:将字符串转换成整型数:atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将 ...
- PHP中的生成XML文件的4种方法分享
生成如下XML串 Xml代码 <?xml version="1.0" encoding="utf-8"?> <article> < ...
- Android 最新学习资料收集
收集这份资料的灵感来源于我的浏览器收藏夹快爆了,后来在github 上也看到了很优秀的开源库的收集资料,非常的好,但是太过于多,也不够新,所以决定自己来做一个.原始的markdowm文件已经放到git ...
- 【复杂度分析】loj#6043. 「雅礼集训 2017 Day7」蛐蛐国的修墙方案
感觉有点假 题目大意 数据范围:$n<=100$ 题目分析 由于题目给出的是 置换,所以相当于只需枚举每个环的两个状态. 主要是复杂度分析这里: 一元环:不存在 二元环:特判保平安 三元环:不存 ...
- zabbix proxy安装配置
1.下载软件zabbix-2.2.1.tar.gz 1.1解压 tar xvf zabbix-2.2.1.tar.gz 1.2编译安装 cd zabbix-2.2.1./configure --pre ...
- 前端性能优化JavaScript篇
关于前端性能优化的讨论一直都很多,包罗的知识也很多,可以说性能优化只有更好,没有最好.前面我写了一篇关于css优化的总结文章,今天再从javascript方面聊一聊. 1.从资源加载方面来说,浏览器的 ...
- 想学习一下node.js,重新安装配置了node
根据这个网站上的教程安装配置的,还不错一次就成功了.觉得安装没什么,就是配置路径的时候容易错. http://www.runoob.com/nodejs/nodejs-install-setup.ht ...