您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

Java反射六:getDeclared系列方法;(一个补充)

 本部分是对Java反射二:反射的核心类:Class类;Java反射三:反射的核心类:Constructor构造方法类;Java反射四:反射的核心类:Method方法类;Java反射五:反射的核心类:Field成员变量类;中的补充。 即getDeclared系列方法解决的是非public构造方法|方法|属性的获取

 目录

1.getDeclared***系列方法介绍

2.getDeclared***系列方法案例:


1.getDeclared***系列方法介绍

(1)【getDeclaredConstructor(s)|getDeclaredMethod(s)|getDeclaredField(s)】:不仅能获取使用public修饰的构造方法|方法|属性;还能获取到不是public修饰的构造方法|方法|属性;(s)获取对应的集合;

(2)【getConstructor(s)|Method(s)|Field(s)】这些只能获取public修饰的构造方法|方法|属性;;这些都是前几篇博客中介绍的;

(3)使用【getConstructor(s)|Method(s)|Field(s)】这些去访问不是public修饰的构造方法|方法|属性,则会抛异常;此时就需要使用getDeclaredConstructor(s)|getDeclaredMethod(s)|getDeclaredField(s)系列方法了;

(4)【getConstructor(s)|Method(s)|Field(s)获取到的构造方法|方法|属性是【getDeclaredConstructor(s)|getDeclaredMethod(s)|getDeclaredField(s)】获取到的构造方法|方法|属性的子集。

(5)【getDeclaredConstructor(s)|getDeclaredMethod(s)|getDeclaredField(s)】:会获取到私有的构造方法|方法|属性;当对这些私有的构造方法|方法|属性进行访问或者调用的时候,会抛出IllegalAccessException异常。


2.getDeclared***系列方法案例:

getDeclaredConstructor(s)|getDeclaredMethod(s)|getDeclaredField(s)】:会获取到public修饰的,也会获取到不是public修饰的;当遍历的时候,遇到public就可以直接获取、使用;遇到不是public(private或者protected)的时候,就需要通过get方法进行数据提取了;

Employee类:

package com.imooc.reflect.entity;

public class Employee {

    static {
        System.out.println("Employee的初始化静态代码块,只有Employee类被" +
                "加载的时候,这个代码块才会执行性。");
    }
    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;
        System.out.println("Employee的带参构造方法。");
    }

    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;
    }


    /**
     * 为了方便观看,Employee对象的四个属性的值,,这儿重写了toString()方法
     * @return
     */
    @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.salary);
        return this;
    }

}

Employee类几点说明:

(1)属性有public的也有非public的;

GetDeclaredSample类:

package com.imooc.reflect;

import com.imooc.reflect.entity.Employee;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class GetDeclaredSample {
    public static void main(String[] args) {
        try {
            //加载类,获取Class类对象;
            Class employeeClass = Class.forName("com.imooc.reflect.entity.Employee");
            //获取Constructor构造方法类对象;;
            Constructor employeeConstructor = employeeClass.getConstructor(new Class[]{
                    Integer.class, String.class, Float.class, String.class
            });
            // 得到一个实际的Employee类对象,后面演示用
            Employee employee = (Employee) employeeConstructor.newInstance(new Object[]{
                    123, "张三", 8900f, "研发部"
            });
            // 如下,获取所有属性的数组,类型是Field类型
            Field[] fields = employeeClass.getDeclaredFields();
            for (Field field:fields){
                if (field.getModifiers() == 1){  // field.getModifiers() == 1,说明当前成员变量是public修饰的
                    Object val = field.get(employee);  // 获取当前属性(对于employee对象)的数值;
                    System.out.println(field.getName()+":"+val);  // val会自动调用toString()打印输出
                } else if (field.getModifiers() == 2){   field.getModifiers() == 2,说明当前成员变量是private修饰的
                    //拼凑private属性的,get方法名字
                    String methodName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
                    // 获取方法对象;;因为get方法没有参数,没有重载形式,所有getMethod()方法不用写第二个参数;
                    Method getMethod = employeeClass.getMethod(methodName);
                    // 因为get方法没有参数,所有invoke()方法不用谢第二个参数
                    Object ret = getMethod.invoke(employee); //因为Employee不同属性对应的get方法返回值类型是不一样的,所有这儿并没有强转类型,而是是要看哪个Object类型去接收
                    System.out.println(field.getName()+":"+ret);
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

 GetDeclaredSample类的几点说明:

(1) 整体描述

(2)

(3)多看下代码中的注释吧。

 

 

 

 

 


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进