Java反射(Reflect)

news/2024/5/19 3:02:00 标签: java, 开发语言, 后端, 反射

反射机制的核心思想

运行时动态访问类与对象的技术

反射在代码层面运用

Class类

class是jvm中代表类和接口的类
class是反射机制的核心,代码层面的关键

Constructor构造方法类

Method方法类

Field成员变量类 getDeclared获取私有属性

相关代码演示

首先创建一个员工对象类Employee

java">package entity;

public class Employee {
    static {
        System.out.println("已经加载到jvm");
    }

    private Integer eno;
    public String ename;
    private Float salary;
    private String dname;


    public Employee() {
        System.out.println("employee 构造方法");
    }

    public Employee(Integer eno, String ename, Float salary, String dname) {
        this.eno = eno;
        this.ename = ename;
        this.salary = salary;
        this.dname = dname;
    }

    public Integer getEno() {
        return eno;
    }

    public void setEno(Integer eno) {
        this.eno = eno;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public Float getSalary() {
        return salary;
    }

    public void setSalary(Float salary) {
        this.salary = salary;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "eno=" + eno +
                ", ename='" + ename + '\'' +
                ", salary=" + salary +
                ", dname='" + dname + '\'' +
                '}';
    }
     //加薪水方法
    public Employee updateSalary(Float val) {
        this.salary = this.salary + val;
        System.out.println(this.ename + "薪水增加:" + val);
        return this;
    }
}

针对反射相关的四个类进行代码演示

java">import entity.Employee;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Locale;

public class ClassSample {
    public static void main(String[] args) {
        try {
            //核心Class类获取类路径
            Class employeeClass = Class.forName("entity.Employee");
            //构造对象
            Constructor constructor = employeeClass.getConstructor(new Class[]{Integer.class, String.class, Float.class, String.class});
            Employee employee = (Employee) constructor.newInstance(new Object[]{
                    100, "小明", 3000f, "市场营销"
            });//只要是参数都用object传入,只要是类都用class传入
            //获取方法
            Method updateSalaryMethod = employeeClass.getMethod("updateSalary", new Class[]{Float.class});
            //传入对象和参数
            Employee employee1 = (Employee) updateSalaryMethod.invoke(employee, new Object[]{5000f});
            System.out.println(employee1); /*小明薪水更新为:8000.0
            Employee{eno=100, ename='小明', salary=8000.0, dname='市场营销'}*/
            //通过Filed 对属性进行修改
            Field enameFiled = employeeClass.getField("ename");
            enameFiled.set(employee, "小刚");
            String ename = (String) enameFiled.get(employee);
            System.out.println("ename:" + ename);
            //通过getDeclaredFields获取私有属性
            Field[] fields = employeeClass.getDeclaredFields();
            for (Field field : fields) {
                //获取公有属性
                if (field.getModifiers() == 1) {
                    Object val = field.getName();
                    System.out.println(field.getName() + ":" + val);
                } else if (field.getModifiers() == 2) {
                    String methodName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
                    Method getMethod = employeeClass.getMethod(methodName);
                    Object ret = getMethod.invoke(employee);
                    System.out.println(field.getName() + ":" + ret);
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

    }
}


http://www.niftyadmin.cn/n/860308.html

相关文章

Linux 命令大全

Linux系统目录 远程访问linux服务器 首先linux服务器位于天南海北,想从服务器调取一些数据,总不能专程跑过去,所以需要一款能够远程访问服务器的软件 Xshell是著名的linux客户端,常用于windows下远程访问 xftp是xshell配套组件,用于向服务器上传/下载文件 Linux文件相关操作命令…

阿里云Maven仓库pom文件配置

<repository><id>aliyun</id><name>aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url></repository>

组合数学(递推)

组合数学公式 组合数学性质 组合数学递推性质 我们利用组合数学递推公式,建立一个数组a那么可以得出:a(i,j)a(i-1,j-1)a(a-1,j) 在初始化时a(0,0)1 (利用组合数学公式0!1) 通过双层for循环可以推出Cnm 代码实现 f[0][0]1;for(int i1;i<1e4;i)//注意i从1开始{for(int j0;j&l…

C语言线性表插入删除操作

#include <stdio.h> #include <stdlib.h> #include<stdbool.h>//bool类型包#define MAXSIZE 20/* 线性表起始长度从1开始,本质是封装一个数组*/ // typedef 关键字来定义自己习惯的数据类型名称&#xff0c;来替代系统默认的基本类型名称、数组类型名称、指针…

王道数据结构习题代码2.2.3(线性表)

第一题(c语言) #include <stdio.h> #include <stdlib.h> #include<stdbool.h>#define maxn 100typedef int Elemtype;typedef struct {Elemtype data[maxn];int len; } SqList;bool Del_Min(SqList *L,Elemtype *e) {if(L->len0)return false;*eL->d…

数组逆置(C语言)

c语言实现数组逆转 void Reverse(DataType A[],int left,int right,int arraySize) {if(left>right||right>arraySize)return false;int mid(leftright)/2;for(int i0; i<mid-left; i){DataType tempA[lefti];A[lefti]A[right-i];A[right-i]temp;} }

顺序表删除问题大全

FROM 王道2.23 03 05 顺序表删除值为x或值位于某个区间问题 删除所有值为x的问题 解题思路 利用一个指针k,只要遇见值为x,忽略,只要遇见值不等于x的元素,将当前元素赋值给指针指向位置,指针,移动到下一个不为x的位置,也就是将不为x的元素挑选出来 #include <stdio.h> #i…

数组两段区间互换位置问题

FROM 王道2.23 08 题目描述 在一维数组A[mn]中依次存放两个线性表,(a1,a2,…am)和(b1,b2,…bn)编写一个函数,将数组中两个顺序表的位置呼唤,即将(b1,b2…bn)放在(a1,a2…am)前面,线性表A和B的内部位置不能改变 解题思路 首先要将(b1,b2…bn)放在(a1,a2…am)的前面,先不用考虑内…