[toc]
基础面试题-反射
1、什么是反射
主要是指程序可以访问、检测和修改它本身状态的一种行为,反射就是把 java 类中的各个成分映射为一个个对象,一个类里有:成员变量、方法、构造方法、包等信息。
Java 反射是 Java 被视为动态语言的一个关键性质,这个机制允许程序在运行时透过 Relfection APIs
取得任何一个已知名称 class
的内部信息,包括 modifiers
(诸如 public
、static
等)、superclass
(例如 Object
),实现 interfaces
(例如 Cloneable
)也包括 fiedls
和 methods
的所有信息,并可以改变 fields
内容或唤起 methods
在静态语言中,使用一个变量,必须知道他的存在,Java 中,变量的类型信息在编译时都保存到 class 文件中,这样在运行时才能保证准确无误,换句话说,程序在运行时都是固定的,如果这个时候想改变,就需要反射这个东西了。
实现 Java 发射机制的类都位于 java.lang.relfect 包中
- Class类:代表一个类
- Field类:代表类的成员变量(类的属性)
- Method类:代表类的方法
- Constructor类:代表类的构造方法
- Array类:提供了动态创建数组,以及访问数组的元素的静态方法
一句话概括就是使用反射可以赋予 jvm
动态编译的能力,否则类的元数据信息只能用今天该编译的方式实现,例如热加载,Tomcat
和 classloader
都无法支持
快速通道:什么是反射,Java反射是什么
### 2、反射机制的优缺点
优点:
- 反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力
- 通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类
- 使用反射机制能够在运行时构造一个类的对象、判断一个类所具有的成员变量和方法、调用一个对象的方法。
- 反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中
缺点:
- 性能问题,反射中包含很多动态类型,Java虚拟机不能对这些动态内容进行优化,因此反射操作效果要比正常效果低很多
- 安全限制,反射通常需要程序在运行么有安全方面的限制,如果一个程序有安全需求,那就最好不要使用反射
- 程序健壮性,反射允许代码执行一些通常不被运行的操作,使用反射会导致意想不到的后果。反射代码破坏了Java程序结构的抽象性。
快速通道:Java反射的优缺点
3、如何获取反射Class
- 调用某个对象的 getClass 方法
People p = new People();
Class cazz = p.getClass();
- 调用某个 class 属性来获取对应的 Class 对象
Class clazz = People.class;
- 使用 Class 类中的静态方法 forName() 获取
Class clazz = Class.forName("xxx.xxx.People");
有了 class 对象,我们可以通个调用 newInstance() ,默认调用无参构造来返回一个对象
String str = (String)(Class.forName("java.lang.String").newInstance());
也可以通过 Constructor 构造器来获取对象
// 调用无参的私有构造函数
Constructor c1 = Class.forName("java.lang.String").getDeclaredConstructor();
c1.setAccessible(true);
String str1 = (String) c1.newInstance();
// 调用有参的私有构造函数
Constructor c2 = Class.forName("java.lang.String").getDeclaredConstructor(new Class[] { String.class });
c2.setAccessible(true);
String str2 = (String) c2.newInstance("hello");
快速通道:简述Java中Class类的作用
4、反射的实现方法
举例:
- 通过 Class 对象枚举该类所有方法
- 通过 Method.setAccessible() 绕过 Java 语言的访问权限,在其他方法中调用该私有方法
- Spring 框架中 IOC 依赖反转基于反射机制