• Java高级之反射


    关于反射的举例:
    在这里插入图片描述

    示例代码:Fan.java

    package testFanShe;
    
    /**
     * @author: Arbicoral
     * @Description: 测试反射:
     *                  成员变量:2个public,2个private
     *                  构造器:4个public,2个private
     *                  成员方法:1个private,1个public
     */
    public class Fan {
        private String name;
        private int age;
        public String address;
        public String say;
    
        public Fan() {}
    
        private Fan(String name) {this.name = name;}
        public Fan(String address, String name) {this.address = address;this.name = name;}
    
        private Fan(boolean isMarried,String address){
            this.address=address;
        }
        public Fan(String name, int age) {this.name = name;this.age = age;}
    
        public Fan(String name, int age, String address, String say) {
            this.name = name;
            this.age = age;
            this.address = address;
            this.say = say;
        }
    
        public void show(){
            System.out.println("我是反射...");
        }
    
        private void run(){
            System.out.println("running...");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    通过反射获取 Fan.java中的成员变量、成员方法、构造器等成分。

    TestFan.java

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Member;
    import java.lang.reflect.Method;
    
    /**
     * @author: Arbicoral
     * @Description: 测试 Fan类
     */
    public class TestFan {
        private static Class<Fan> fanClass;
    
        public static void main(String[] args) throws Exception {
            // -------------- 一、获取Class对象的三种方式:Class对象---------------------
            // 方式 1.获取class对象
            fanClass = Fan.class;
            // 方式 2. 调用Class提供的方法:public static Class forName(String className)
            Class<?> aClass = Class.forName("testFanShe.Fan");
            // 方式 3. Object提供的方法:public final native Class getClass();
            // Class c3=对象.getClass();
            Fan fan = new Fan();
            Class<? extends Fan> aClass1 = fan.getClass();
    
    
            // -------------- 二、获取类的构造器:Constructor对象---------------------
            // 2.获取全部public构造器
            Constructor<?>[] constructors = aClass.getConstructors();
            for (Constructor constructor:constructors){
                // 获取构造器的名字和构造器中参数的个数
                System.out.println(constructor.getName()+"-->"+constructor.getParameterCount());
            }
            System.out.println("=============");
            // 3.获取所有构造器,无论是否是public
            Constructor<?>[] declaredConstructors = fanClass.getDeclaredConstructors();
            for (Constructor dc:declaredConstructors){
                System.out.println(dc.getName()+"-->"+dc.getParameterCount());
            }
            System.out.println("********************");
            // 4. 根据参数获取public构造器
            Constructor constructor = fanClass.getConstructor(String.class, int.class);
            System.out.println(constructor.getName()+"-->"+constructor.getParameterCount());
    
            System.out.println("-----------------");
            // 5. 根据参数获取所有构造器,无论是否是public
            Constructor<Fan> dc = fanClass.getDeclaredConstructor(boolean.class, String.class);
            dc.setAccessible(true);
            // dc.newInstance();
            System.out.println(dc.getName()+"-->"+dc.getParameterCount());
            System.out.println("********************");
    
            // -------------- 三、获取类的成员变量:Field对象---------------------
            // 获取全部public的成员变量
            Field[] fields = fanClass.getFields();
            for (Field f:fields){
                System.out.println(f.getName());
            }
            System.out.println("********************");
            // 获取所有的成员变量,无论是否是public
            Field[] declaredFields = fanClass.getDeclaredFields();
            for (Field f:declaredFields){
                System.out.println(f.getName());
            }
    
            // -------------- 四、获取类的成员方法:Method对象---------------------
            // 获取全部public的成员方法
            System.out.println("********************");
            Method[] methods = fanClass.getMethods();
            for (Member m:methods){
                System.out.println(m.getName());
            }
            System.out.println("********************");
            for (Method declaredMethod : fanClass.getDeclaredMethods()) {
                System.out.println(declaredMethod.getName());
            }
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    总结:

    反射的作用:

    1. 基本作用:可以得到一个类的全部成分,然后进行操作;
    2. 可以破坏封装性;
    3. 适合做Java框架,基本上,主流的框架都会基于反射设计一些通用的功能。
  • 相关阅读:
    从0开始学Java:Java概述
    Pandas使用explode实现一行变多行统计
    计算机操作系统重点概念整理-第二章 进程管理【期末复习|考研复习】
    【LeetCode: 207.课程表:拓扑排序+图】
    DeepSort目标跟踪算法
    uview的u-subsection分段器组件的使用
    【实用】Linux系统知识小汇
    深入理解 JVM 之——动手编译 JDK
    【前言】神经网络与深度学习简介
    文件上传过大被限制问题-springboot
  • 原文地址:https://blog.csdn.net/Miss_croal/article/details/133656429