他们分别是:
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()方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)