龙空技术网

Java面试必背——什么是反射?它有什么用途和优缺点?附示例代码

不发牢骚的老码农 29

前言:

如今大家对“反射与泛型java”大概比较关切,我们都想要知道一些“反射与泛型java”的相关文章。那么小编也在网上网罗了一些关于“反射与泛型java””的相关内容,希望你们能喜欢,我们一起来了解一下吧!

一个常见的java面试问题是:什么是反射(reflection)?它有什么用途和优缺点?

正确答案是:

反射(reflection)是一种在运行时动态获取和操作类、对象、方法、属性等信息的机制 。反射的用途有:实现泛型(generic) ,例如List<String>和List<Integer>在编译时都会被擦除为List,但是在运行时可以通过反射获取到实际的类型参数。实现注解(annotation) ,例如@Override和@Test等,可以在运行时通过反射获取到注解的信息和作用对象。实现动态代理(dynamic proxy) ,例如可以在运行时创建一个实现了某个接口的代理对象,然后通过反射调用其方法。实现框架(framework) ,例如Spring和Hibernate等,可以通过反射实现依赖注入(dependency injection)、对象关系映射(object-relational mapping)等功能。反射的优点有:提高了代码的灵活性和扩展性 ,可以在运行时动态创建和调用对象,而不需要事先知道具体的类名和方法名。减少了代码的重复性和冗余性 ,可以通过反射实现通用的操作,而不需要针对每个类和方法编写特定的代码。反射的缺点有:降低了代码的性能 ,因为反射涉及到了运行时类型检查、方法调用等额外的开销,比直接的代码执行要慢很多。增加了代码的复杂性和风险 ,因为反射可能会破坏类的封装性和安全性,例如可以通过反射访问私有的成员或者修改final的变量。

一个示例程序如下:

// 导入反射相关的类import java.lang.reflect.*;// 定义一个接口interface Animal {    void eat();}// 定义一个实现了接口的类class Cat implements Animal {    private String name; // 私有属性    public Cat(String name) { // 公有构造器        this.name = name;    }    public void eat() { // 实现接口方法        System.out.println(name + " is eating fish.");    }}// 定义一个测试类public class ReflectionTest {    public static void main(String[] args) throws Exception {        // 通过类名获取Class对象        Class<?> cls = Class.forName("Cat");        // 通过Class对象创建实例        Object obj = cls.getDeclaredConstructor(String.class).newInstance("Tom");        // 通过Class对象获取接口        Class<?>[] interfaces = cls.getInterfaces();        // 遍历接口        for (Class<?> i : interfaces) {            System.out.println(i.getName());        }        // 通过Class对象获取方法        Method method = cls.getMethod("eat");        // 通过反射调用方法        method.invoke(obj);        // 通过Class对象获取属性        Field field = cls.getDeclaredField("name");        // 设置属性可访问        field.setAccessible(true);        // 通过反射修改属性        field.set(obj, "Jerry");        // 通过反射再次调用方法        method.invoke(obj);    }}

输出结果为:

AnimalTom is eating fish.Jerry is eating fish.

这个程序演示了如何通过反射获取和操作类、对象、方法、属性等信息,以及反射的用途和优缺点。希望你能够理解和掌握反射的概念和应用。

祝你面试成功!

标签: #反射与泛型java #java的object类型怎么取属性值 #java反射主要涉及的类 #java反射私有变量