概述
在运行时状态中,可以获取程序或者程序集的每一个类型的成员或成员信息。核心在于可以运行时动态加载类或者调用方法/属性,不需要事先知道运行对象是谁。
用途
- 使用IDE 时,输入一个累活对象,调用它的属性或者方法时,输入 . IDE就自动列出类的方法或属性,这就是java 的反射用途之一。
- 在框架设计时,模块间不能相互依赖,这是就需要使用反射获取其他模块的类对象。
- 某些类的私有方法(属性)无法直接调用,但是又必须使用时,可以使用反射机制获取类对象的私有方法(属性)并调用。
类的加载过程
Java 文件从编码完成到执行经过两个过程:
**编译:**通过 javac 命令编译成字节码,也就是 .class 文件。
**运行:**把编译生成的 .class 文件交给 JVM 执行。
**类的加载过程:**JVM 虚拟机将 .class 文件中的信息加载到内存中,解析生成对应的 Class 对象,作为这个类的数据访问入口。同一个类,在 内存中只存在一个 Class 对象。
也就是说JVM并不是一次性把所有类都加载到内存中,而是第一次执行到这个类的时候加载,且只加载一次。
Class 类的实例表示正在运行的Java应用程序中的类和接口。
Class 没有公共的构造方法。
反射的使用
1、获取Class 对象
反射获取 Class 对象有三种方法:
-
调用对象的 getClass() 方法:
String str = new String(); Class<?> cls = str.getClass(); -
直接获取对象(包括基本数据类型)的 class 属性:
Class<?> cls = int.class; -
使用 Class.forName 方法:
Class<?> cls = Class.forName("类名");
在反射里,一般使用第3种方法,第一种已经获取对象,没必要反射。第二种已经知道类型,需要引入包名,比较麻烦。第3种知道类的全提名即可。
2、创建实例
-
可以使用Class 对象的newInstance()方法来创建Class对象应用类的实例。
Class<?> cls = String.class; Object oj = cls.newIntance(); -
可以通过获取Constructor对象的newInstance()方法。这种方式可以指定构造类实例。
Class<?> cls = String.class;

本文深入讲解Java反射机制的核心概念和应用场景,包括类的加载过程、Class对象的获取方式、实例的创建方法、成员变量和方法的获取及调用等。同时探讨了反射机制可能带来的性能和安全性问题。

1795

被折叠的 条评论
为什么被折叠?



