day07_反射——简单介绍

反射简单介绍

1. 简介

  • 定义:Java语言中 一种 动态(运行时)访问、检测 & 修改它本身的能力

  • 作用:动态(运行时)获取类的完整结构信息 & 调用对象的方法

  1. 类的结构信息包括:变量、方法等
  2. 正常情况下,Java类在编译前,就已经被加载到JVM中;而反射机制使得程序运行时还可以动态地去操作类的变量、方法等信息

2. 特点

2.1 优点

灵活性高。因为反射属于动态编译,即只有到运行时才动态创建 &获取对象实例。

编译方式说明:

  1. 静态编译:在编译时确定类型 & 绑定对象。如常见的使用new关键字创建对象
  2. 动态编译:运行时确定类型 & 绑定对象。动态编译体现了Java的灵活性、多态特性 & 降低类之间的藕合性

2.2 缺点

  • 执行效率低
    因为反射的操作 主要通过JVM执行,所以时间成本会 高于 直接执行相同操作
  1. 因为接口的通用性,Java的invoke方法是传object和object[]数组的。基本类型参数需要装箱和拆箱,产生大量额外的对象和内存开销,频繁促发GC。
  2. 编译器难以对动态调用的代码提前做优化,比如方法内联。
  3. 反射需要按名检索类和方法,有一定的时间开销。
  • 容易破坏类结构
    因为反射操作饶过了源码,容易干扰类原有的内部逻辑

4. 具体如何使用

4.1 Java反射机制提供的功能

 
 代码展示:
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
 


posted @ 2020-08-21 18:03  二零二零  阅读(82)  评论(0编辑  收藏  举报