用反射得到源数据对象的方式
来源:互联网 发布:社交媒体情景类数据 编辑:程序博客网 时间:2024/05/20 13:07
一、Java的反射机制
每个Java程序执行前都必须经过编译、加载、连接、和初始化这几个阶段,后三个阶段如下图:
其中
i、加载是指将编译后的java类文件(也就是.class文件)中的二进制数据读入内存,并将其放在运行时数据区的方法区内,然后再堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构。即加载后最终得到的是Class对象,并且更加值得注意的是:该Java.lang.Class对象是单实例的,无论这个类创建了多少个对象,他的Class对象时唯一的!!!!。 而 加载并获取该Class对象可以通过三种途径:
Class.forName(类的全路径)、实例对象.class(属性)、实例对象getClass() 。关于他们的区别将在下面讲到!!!
###另外 ,类加载时类中的静态代码块会得到执行(详见前一篇博客:Class.forName()加载JDBC驱动)
ii、在 连接和初始化阶段,其实静态变量经过了两次赋值:第一次是静态变量类型的默认值;第二次是我们真正赋给静态变量的值。
iii、Java对类的使用分为两种方式:主动使用和被动使用。其中主动使用如下图:
而类的初始化时机正是java程序对类的首次主动使用,除了以上6中方式,其他对类的使用都是被动使用,都不会导致类的初始化。 并且应该注意以下几个方面:
在这里可以看出;接口的两重性:可以把接口当做类(因为在接口中有静态变量时,他可以被初始化);接口就是接口,和类无关(接口中 没有构造方法,所以不能被初始化)
二、Class.forName、实例对象.class(属性)、实例对象getClass()的区别
1、相同点:
通过这几种方式,得到的都是Java.lang.Class对象(这个是上面讲到的 类在加载时获得的最终产物)
例如:
package demo;
public class A
{
public static void main(String[] args) throws Exception
{
System.out.println(A.class);//通过类.class获得Class对象
A a = new A();
System.out.println(a.getClass());//通过 实例名.getClass()获得Class对象
System.out.println(Class.forName("demo.A"));//通过Class.forName(全路径)获得Class对象
System.out.println(".................................");
System.out.println(a);//使用不同的方式创建对象
System.out.println(A.class.newInstance());
System.out.println(a.getClass().newInstance());
System.out.println(Class.forName("demo.A").newInstance());
}
}
结果:class demo.A
class demo.A
class demo.A (这里也可以得到一个类的Class对象是唯一的)
.......................................
demo.A@de6ced
demo.A@c17164
demo.A@1fb8ee3
demo.A@61de33
2、区别:
在这里可以看出;接口的两重性:可以把接口当做类(因为在接口中有静态变量时,他可以被初始化);接口就是接口,和类无关(接口中 没有构造方法,所以不能被初始化)
public class A
{
}
结果:class demo.A
.......................................
2)Class
3)Class.forName("类名");
从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用Class对象的newInstance()方法的时候,就必须保证:1、这个
现在可以看出,Class对象的newInstance()(这种用法和Java中的工厂模式有着异曲同工之妙)实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。
最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance:
new:
0 0
- 用反射得到源数据对象的方式
- java用反射得到对象的属性值
- java反射得到类对象,并且得到类的属性
- 已知一个对象,用反射的方式复制另一个对象
- 反射获取class有几种方式,怎样得到对应的实例
- Session 其他的范围对象的得到方式
- 数据层反射对象
- Android中通过反射和getResource()得到id的方式去改变View的显示效果
- 游戏用得到的压缩方式
- 通过反射从数据库返回集合ResultSet中得到实体对象的list集合
- c#中用反射的方式实例化对象
- 反射获取class对象的三种方式
- 反射中获取class对象的三种方式
- 反射概念:获取class文件对象的三种方式
- java 反射之获取class对象的三种方式
- 反射_获取class文件对象的三种方式
- 反射-获取class文件对象的三种方式
- java反射应用-配置文件的方式实例化对象
- dojo小例子(23)EnhancedGrid、DataGrid当加载完成后获取记录总数
- Objective-C学习笔记1--windows+GNUstep环境下不能使用@autoreleasepool?
- [Python] SQLBuilder 示例代码
- 关于人眼的视觉盲区
- windows phone推送介绍(https)
- 用反射得到源数据对象的方式
- Oracle - expdp、impdp 用法详解
- Android 2.x.x版本下错误:java.lang.NoSuchMethodError: android.view.View.setBackground 解决
- ADF VO知识
- Android布局中实现圆角边框
- 由CCSprite通过CCRenderTexture得到CCImage
- 凸包模板
- XCTest框架定义的常用断言宏
- struts2 json插件