通俗比喻:
反射就像你拿着放大镜去看一个盒子(类)里有什么东西(属性、方法),还可以偷偷改里面的东西。
功能 | 举例 |
|---|---|
获取类信息 | 类名、包名、父类、接口 |
获取成员信息 | 属性、方法、构造器 |
动态创建对象 | 不用 new,运行时生成对象 |
调用方法 | 动态调用某个方法 |
操作属性 | 读写私有属性 |
Class 对象Class<?> clazz1 = Class.forName("com.example.User"); // 通过全类名 |
|---|
Class<User> clazz2 = User.class; // 通过类名 |
|---|
User user = new User(); |
|---|
Class<? extends User> clazz3 = user.getClass(); // 通过对象 |
|---|
User user = clazz1.getDeclaredConstructor().newInstance(); |
|---|
new User()Constructor<User> constructor = clazz1.getDeclaredConstructor(String.class, int.class); |
|---|
User user = constructor.newInstance("Alice", 20); |
|---|
Field field = clazz1.getDeclaredField("name"); // 私有属性也可以 |
|---|
field.setAccessible(true); // 打开私有权限 |
|---|
field.set(user, "Bob"); // 修改属性 |
|---|
String name = (String) field.get(user); // 获取属性 |
|---|
Method method = clazz1.getDeclaredMethod("sayHello", String.class); |
|---|
method.setAccessible(true); // 私有方法也能调用 |
|---|
method.invoke(user, "World"); // 调用方法 |
|---|
System.out.println("类名:" + clazz1.getName()); |
|---|
for (Field f : clazz1.getDeclaredFields()) { |
|---|
System.out.println("属性:" + f.getName()); |
|---|
} |
|---|
for (Method m : clazz1.getDeclaredMethods()) { |
|---|
System.out.println("方法:" + m.getName()); |
|---|
} |
|---|
Class 对象Method.invoke(),JVM 找到方法内存地址并执行setAccessible(true) 直接修改 JVM 的访问检查List,具体类型 List<String> 不可直接获取一句话大白话总结:
反射就是“在运行时偷看并操作类的内部结构”,让你可以写更灵活、更通用的程序,但也要小心别用多了拖慢性能或者破坏封装。
https://www.52runoob.com/archives/6411
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。