首页 / JAVA / 《Java类加载机制和反射机制》
《Java类加载机制和反射机制》
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了《Java类加载机制和反射机制》,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4542字,纯文字阅读大概需要7分钟。
内容图文
开发工具与关键技术:MyEclipse 10、Java
作者:潘玉莹
撰写时间:2019-06-08
一、 Java类的生命周期
- jvm把class文件加载到内存,并对数据进行校验、解析和初始化,终形成jvm可以直接使用的java类型的过程。
- 加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中 的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方 法区类数据的访问入口。
- 链接:将java类的二进制代码合并到jvm的运行状态之中的过程,链接过程又分为3 个过程: a. 验证:确保加载的类信息符合jvm规范,没有安全方面的问题。 b. 准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段, 这些内存都将在方法区中进行分配。 c. 解析:虚拟机常量池内的符号引用替换为直接引用的过程。(比如String s =“aaa”,转化为 s的地址指向“aaa”的地址)
- 初始化:初始化阶段是执行类构造器方法的过程。类构造器方法是由编译器自动收 集类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的。 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先初 始化其父类的初始化 虚拟机会保证一个类的构造器方法在多线程环境中被正确加锁和同步 当访问一个java类的静态域时,只有真正声明这个静态变量的类才会被初始化。
二、 ClassLoader类加载器 - ClassLoader类加载器的作用就是将 .class 文件加载到JVM虚拟机中去
- 类加载器简单使用示例代码:
三、Java反射机制
在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意 一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态 获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。通俗点讲, 通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。
如下为Class的常用类:
a) forName(String className) :返回与带有给定字符串名的类或接口相关联的 Class 对象。
b) forName(String name, boolean initialize, ClassLoader loader)
使用给定的类加载器,返回与带有给定字符串名的类或接口相 关联的 Class 对象。
c) getClassLoader():返回该类的类加载器。
d) getConstructor(Cl ass… parameterTypes):
返回一个 Constructor 对象,它反映此 Class 对象所表示的类 的指定公共构造方法。
e) getConstructors():
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
f) getDeclaredCons tructor(Class… parameterTypes)
返回一个 Constructor 对象,该对象反映此 Class 对象所表示 的类或接口的指定构造方法。
g) getDeclaredCons tructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对 象表示的类声明的所有构造方法。
h) getDeclaredField( String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或 接口的指定已声明字段。
i) getDeclaredField s()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表 示的类或接口所声明的所有字段。
j) getDeclaredMeth od(String name, Class… parameterTypes)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类 或接口的指定已声明方法。
k) getDeclaredMeth ods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表 示的类或接口声明的所有方法,包括公共、保护、默认(包) 访问和私有方法,但不包括继承的方法。
l) getField(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口 的指定公共成员字段。
m) getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
n) getMethod(String name, Class… parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接 口的指定公共成员方法。
o) getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的 以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
代码如下: - 加载类的方式;通过反射机制获取构造器 声明一个数组存放类。
- 通过反射机制获取 声明一个数组存放获取到方法
- 通过反射机制调用构造器实例化一个类的对象
- 通过反射机制调用普通方法
四、 反射机会制破坏单例模式
注意:这只是演示反射机制,在正常的开发中不能这样使用 返回的结果是
S1s2 =false
代码如图所示:
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
SingletonOne s1 = SingletonOne.getInstance();
Class<?> class1 = SingletonOne.class;
Constructor<?> constructor = class1.getDeclaredConstructor();
constructor.setAccessible(true);
SingletonOne s2 = (SingletonOne) constructor.newInstance();
//判断s1s2
System.out.println("s1s2 = "+(s1s2));
}
}
五、 通过反射机制往List中添加任意类型的元素
注意:这只是演示反射机制,在正常的开发中不能这样使用
示例代码:
public class ReflectDemo3 {
public static void main(String[] args) {
List list=new ArrayList();
list.add(11);
try {
Class<?> class1=list.getClass();
Method addMethod=class1.getMethod(“add”, Object.class);
addMethod.invoke(list, “asfdgh”);
addMethod.invoke(list, new Person(“s”, 1));
addMethod.invoke(list, true);
addMethod.invoke(list, new Date());
System.out.println(list);
} catch (Exception e) {
}}
}
内容总结
以上是互联网集市为您收集整理的《Java类加载机制和反射机制》全部内容,希望文章能够帮你解决《Java类加载机制和反射机制》所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。