day07_反射——简单介绍
反射简单介绍
1. 简介
-
定义:
Java
语言中 一种 动态(运行时)访问、检测 & 修改它本身的能力 -
作用:动态(运行时)获取类的完整结构信息 & 调用对象的方法
- 类的结构信息包括:变量、方法等
- 正常情况下,
Java
类在编译前,就已经被加载到JVM
中;而反射机制使得程序运行时还可以动态地去操作类的变量、方法等信息
2. 特点
2.1 优点
灵活性高。因为反射属于动态编译,即只有到运行时才动态创建 &获取对象实例。
编译方式说明:
- 静态编译:在编译时确定类型 & 绑定对象。如常见的使用
new
关键字创建对象- 动态编译:运行时确定类型 & 绑定对象。动态编译体现了
Java
的灵活性、多态特性 & 降低类之间的藕合性
2.2 缺点
- 执行效率低
因为反射的操作 主要通过JVM
执行,所以时间成本会 高于 直接执行相同操作
- 因为接口的通用性,Java的invoke方法是传object和object[]数组的。基本类型参数需要装箱和拆箱,产生大量额外的对象和内存开销,频繁促发GC。
- 编译器难以对动态调用的代码提前做优化,比如方法内联。
- 反射需要按名检索类和方法,有一定的时间开销。
- 容易破坏类结构
因为反射操作饶过了源码,容易干扰类原有的内部逻辑
4. 具体如何使用
4.1 Java
反射机制提供的功能
![](https://upload-images.jianshu.io/upload_images/944365-0fa3bb436c21eb0a.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
代码展示:
package Demo3; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class Demo3 { public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { Class clz = Student.class; System.out.println("得所有字段:"); Field[] fields = clz.getDeclaredFields(); for(Field field : fields) { System.out.println(Modifier.toString(field.getModifiers())+" " + field.getType().getSimpleName() + " " + field.getName()); } //利用反射为s学生对象的两个属性字段赋值 Student s = new Student(); // Class clzz = s.getClass(); //为x字段赋值 Field field_x = clzz.getField("x"); field_x.set(s, "hello"); System.out.println(s.x); //得到name字段 Field field_name = clzz.getDeclaredField("name"); field_name.setAccessible(true); field_name.set(s, "zhangsan"); field_name.setAccessible(false); Field field_age = clzz.getDeclaredField("age"); field_age.setAccessible(true); field_age.set(s, 20); field_age.setAccessible(false); System.out.println(s); } }
运行结果:
得所有字段: public String x protected String y int z private String name private int age hello Student [age=20, name=zhangsan]
心得:没有伞的孩子,只有努力奔跑!加油哇↖(^ω^)↗!
写于2020年8月21日;
想要更加‘反射’得童靴请复制链接:https://www.jianshu.com/p/356e1d7a9d11