Java面试必备:反射是什么?它在Java中的作用和限制有哪些?
发表时间: 2023-09-07 09:24
问题:什么是反射(reflection)?反射在java中有什么作用和限制?如何使用反射包(reflect)来操作任意类型的值?
答案:反射是一种在运行时检查和修改变量类型和值的机制。反射在java中有以下作用和限制:
使用反射包(reflect)来操作任意类型的值的方法有以下几步:
这个问题经常会被面试官问到,因为它考察了你对java中最复杂和最强大的特性之一的理解和掌握程度。如果你能熟练地使用和操作反射,你就能编写出更灵活和更通用的java代码。
示例程序:
package main;import java.lang.reflect.*;public class ReflectionDemo { public static void main(String[] args) throws Exception { // 定义一个类 class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public void sayHello() { System.out.println("Hello, I am " + name); } } // 创建一个Person类型的变量 Person p = new Person("Alice", 20); // 获取p的类型信息 Class<?> cls = p.getClass(); System.out.println("p's class is " + cls.getName()); // p's class is main.ReflectionDemoPerson // 获取p的构造器信息 Constructor<?>[] constructors = cls.getDeclaredConstructors(); for (Constructor<?> c : constructors) { System.out.println("constructor: " + c); } // constructor: main.ReflectionDemoPerson(java.lang.String,int) // 获取p的字段信息 Field[] fields = cls.getDeclaredFields(); for (Field f : fields) { System.out.println("field: " + f); } // field: private java.lang.String main.ReflectionDemoPerson.name // field: private int main.ReflectionDemoPerson.age // 获取p的方法信息 Method[] methods = cls.getDeclaredMethods(); for (Method m : methods) { System.out.println("method: " + m); } // method: public java.lang.String main.ReflectionDemoPerson.getName() // method: public int main.ReflectionDemoPerson.getAge() // method: public void main.ReflectionDemoPerson.sayHello() // 修改p的字段值 Field nameField = cls.getDeclaredField("name"); nameField.setAccessible(true); // 设置为可访问,否则无法修改私有字段 nameField.set(p, "Bob"); // 修改name字段为"Bob" System.out.println("p's name is " + p.getName()); // p's name is Bob // 调用p的方法 Method sayHelloMethod = cls.getDeclaredMethod("sayHello"); sayHelloMethod.invoke(p); // 调用sayHello方法 // Hello, I am Bob // 创建一个Person类型的新值 Constructor<?> constructor = cls.getDeclaredConstructor(String.class, int.class); Person q = (Person) constructor.newInstance("Charlie", 30); // 传入构造器参数 System.out.println("q's name is " + q.getName()); // q's name is Charlie }}