网站首页 > 精选教程 正文
一个常见的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);
}
}
输出结果为:
Animal
Tom is eating fish.
Jerry is eating fish.
这个程序演示了如何通过反射获取和操作类、对象、方法、属性等信息,以及反射的用途和优缺点。希望你能够理解和掌握反射的概念和应用。
祝你面试成功!
猜你喜欢
- 2025-01-19 springboot@EnableAutoConfiguration 注解的作用以及加载流程
- 2025-01-19 java的守护线程的作用
- 2025-01-19 JAVA自定义注解
- 2025-01-19 Spring系列(十一):@Autowired和@Resource注解用法介绍
- 2025-01-19 JAVASE:注解与反射笔记
- 2025-01-19 Java @Data注解
- 2025-01-19 Java 自定义注解在登录验证的应用
- 2025-01-19 揭秘SpringBoot的魔法:20个注解让你的应用飞起来
- 2025-01-19 Java核心基础之自定义注解
- 2025-01-19 Spring 最常用的 7 大类注解,史上最强整理
你 发表评论:
欢迎- 07-10动漫人物像|插画 壁纸 头像 签名 素材
- 07-10运动人物|插画 壁纸 头像 签名 素材
- 07-10动漫人物|插画 壁纸 头像 签名 素材
- 07-10神话人物|插画 壁纸 头像 签名 素材
- 07-10日漫人物像|插画 壁纸 头像 签名 素材
- 07-10 日漫人物|插画 壁纸 头像 签名 素材
- 07-10日漫人物风|插画 壁纸 头像 签名 素材
- 07-10日漫人物|插画 壁纸 头像 签名 素材
- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)