mybatis的反射工具类—MetaObject(反射对象类)

mybatis的反射工具类—MetaObject(反射对象类),第1张

他们分别是:

1获取SystemRuntimeType;//实际上显示的是SystemType这个抽象类。

2当前对象的字符串表示

3比较当前对象

4返回当前对象的哈希值

最后一个Voidctor是构造函数

GetType()指的是你的类中有这个方法其实这个方法继承自Object类(所有的类和结构枚举都默认继承自SystemObject) 。ToString(),Equals(SystemObject),GetHashCode()都一样,他们都继承自Object。

反射类型的成员就是反射层次模型中最下面的一层数据。我们可以通过type对象的GetMembers 方法取得一个类型的成员。如果我们使用的是不带参数的GetMembers,它只返回该类型的公共定义的静态变量和实例成员,我们也可以通过使用带参数的 GetMembers通过参数设置来返回指定的类型成员。具体参数参考msdn 中systemreflectionbindingflags 枚举类型的详细说明。

反射中ClassforName()和ClassLoaderloadClass()的区别

一 Java类装载过程

复制代码

装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Javalangclass对象;

链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;

校验:检查导入类或接口的二进制数据的正确性;(文件格式验证,元数据验证,字节码验证,符号引用验证)

准备:给类的静态变量分配并初始化存储空间;

解析:将常量池中的符号引用转成直接引用;

初始化:激活类的静态变量的初始化Java代码和静态Java代码块,并初始化程序员设置的变量值。

复制代码

二 分析 ClassforName()和ClassLoaderloadClass

复制代码

ClassforName(className)方法,内部实际调用的方法是 ClassforName(className,true,classloader);

第2个boolean参数表示类是否需要初始化, ClassforName(className)默认是需要初始化。

一旦初始化,就会触发目标对象的 static块代码执行,static参数也也会被再次初始化。

ClassLoaderloadClass(className)方法,内部实际调用的方法是 ClassLoaderloadClass(className,false);

第2个 boolean参数,表示目标对象是否进行链接,false表示不进行链接,由上面介绍可以,

不进行链接意味着不进行包括初始化等一些列步骤,那么静态块和静态对象就不会得到执行

复制代码

三 数据库链接为什么使用ClassforName(className)

JDBC Driver源码如下,因此使用ClassforName(classname)才能在反射回去类的时候执行static块。

复制代码

static {

try {

javasqlDriverManagerregisterDriver(new Driver());

} catch (SQLException E) {

throw new RuntimeException("Can't register driver!");

}

}

理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的 *** 作会很有帮助。

一、Class类的使用

1、万事万物皆对象,(当然,基本数据类型,静态成员不是面向对象(属于类的)),所以我们创建的每一个类也都是对象,即类本身是javalangClass类的实例对象,但是这些对象都不需要new出来,因为javalangClass类的构造方法是私有的

2、任何一个类都是Class类的实例对象,这个实例对象有三种表示方式:(我们新建一个Student类)(上海尚学堂java全程老师面授+实战教学)

①Classc1=Studentclass;//实际告诉我们任何一个类都有一个隐含的静态成员变量class(知道类名时用)

②Classc2=stugetClass();//已知该类的对象通过getClass方法(知道对象时用)

③Classc3=ClassforName("类的全名");//会有一个ClassNotFoundException异常

官网解释说:c1,c2表示了Student类的类类型()classtype),万事万物皆对象,类也是对象,是Class类的实例对象,这个对象我们成为该类的类类型(有点乱,但是慢慢捋一下还是能理解的)

这里有一点值得注意,当我们执行Systemoutprintln(c1==c2);语句,结果返回的是true,这是为什么呢?原因是不管c1还是c2都代表了Student类的类类型,一个类可能是Class类的一个实例对象。

我们完全可以通过类的类类型创建该类的对象实例,即通过c1或c2创建Student的实例。

Studentstu=(Student)c1newInstance();//前提是必须要有无参的构造方法,因为该语句会去调用其无参构造方法。该语句会抛出异常。

二、动态加载类

1、编译时加载类是静态加载类,

new创建对象是静态加载类,在编译时刻就需要加载所有可用使用到的类,如果有一个用不了,那么整个文件都无法通过编译

2、运行时加载类是动态加载类

Classc= ClassforName("类的全名"),不仅表示了类的类型,还表示了动态加载类,编译不会报错,在运行时才会加载,使用接口标准能更方便动态加载类的实现。功能性的类尽量使用动态加载,而不用静态加载。北京电脑培训发现

很多软件比如QQ,360的在线升级,并不需要重新编译文件,只是动态的加载新的东西。

以上就是关于mybatis的反射工具类—MetaObject(反射对象类)全部的内容,包括:mybatis的反射工具类—MetaObject(反射对象类)、Java反射访问私有变量和私有方法、C#反射GetMembers()方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9587227.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存