• Java 反射


    结论: 反射出来的只是字节码

    反射: 就是把 Java 类中的各种成分映射成相应的 Java 类

    一个类中的组成部分: 成员变量 | 方法 | 构造方法 | 包等信息用 Field | Method | Contructor | Package 等实例对象表示

     1 package 反射;
     2 
     3 import java.beans.PropertyDescriptor;
     4 import java.lang.reflect.Field;
     5 import java.lang.reflect.Method;
     6 
     7 public class Reflect {
     8     public static void main(String[] args) throws Exception {
     9         孑小 孑小 = new 孑小("孑小", 28);
    10         假装时光能倒流(孑小);
    11     }
    12 
    13     public static <T> void 假装时光能倒流(T t) throws Exception {
    14         Field[] field = t.getClass().getDeclaredFields();
    15         for (int i = 0; i < field.length; i++) {
    16             String fieldName = field[i].getName();
    17             // 通过 PropertyDescriptor 调用 set()和 get()
    18             PropertyDescriptor descriptor = new PropertyDescriptor(fieldName, t.getClass());
    19             Method method = descriptor.getReadMethod();
    20             // method 只是字节码, 它不知道调用哪个类的方法
    21             Object fieldValueOld = method.invoke(t);
    22             System.out.println("[" + fieldName + "=" + fieldValueOld + "]");
    23             if (fieldName.equals("age")) {
    24                 // 得到所有声明的属性, 包括私有属性
    25                 Field age = t.getClass().getDeclaredField("age");
    26                 // 私有属性需要暴力反射
    27                 age.setAccessible(true);
    28                 age.set(t, 23);
    29             }
    30         }
    31         System.out.println(t.toString());
    32     }
    33 }
     1 package 反射;
     2 
     3 public class 孑小 {
     4     private String name;
     5     private int age;
     6 
     7     public 孑小(String name, int age) {
     8         super();
     9         this.name = name;
    10         this.age = age;
    11     }
    12 
    13     public String toString() {
    14         return "[name=" + name + ", age=" + age + "]";
    15     }
    16 
    17     public String getName() {
    18         return name;
    19     }
    20 
    21     public void setName(String name) {
    22         this.name = name;
    23     }
    24 
    25     public int getAge() {
    26         return age;
    27     }
    28 
    29     public void setAge(int age) {
    30         this.age = age;
    31     }
    32 }
  • 相关阅读:
    nginx js、css多个请求合并为一个请求(concat模块)
    Web客户端语言HTML、XHTML和XML相关知识介绍
    正则小略
    你可能不知道的5个功能强大的 HTML5 API
    你须知道的30个CSS选择器 »
    css3 media媒体查询器用法总结
    深入java虚拟机学习 -- 类的加载机制
    ElasticSearch和solr的差别
    idea 使用debugger技巧
    vue学习问题总结(一)
  • 原文地址:https://www.cnblogs.com/sunjunxi/p/8574808.html
Copyright © 2020-2023  润新知