Java学习之路---高级编程(通过放射调用对象的变量和方法,并完成一系列操作)

反射获取成员变量并使用

在这里插入图片描述

获取所有的成员变量:

getFields():获取公共的所有成员变量
getDeclaredFields():获取所有成员变量

学生类:

package JavaAPI.FanShe.Test1.ch01;

public class Student {
    private String name;
    private int age;
    public String sex;
    Integer idNum;
}

测试类:

package JavaAPI.FanShe.Test1.ch02;

import java.lang.reflect.Field;

/**
 * 反射获取对象的变量
 */
public class Test3 {
    public static void main(String[] args) throws Exception {
        Class<?> c = Class.forName("JavaAPI.FanShe.Test1.ch01.Student");
        /**
         * 获取公共的所有成员变量
         */
        System.out.println("获取到的所有的公共成员变量为:");
        Field[] fields = c.getFields();
        for (Field field:fields)
            System.out.println(field);
        System.out.println("-------");
        /**
         * 获取所有成员变量
         */
        System.out.println("获取到的成员变量为:");
        Field[] fields1 = c.getDeclaredFields();
        for (Field field:fields1)
            System.out.println(field);
        System.out.println("-------");
    }
}

在这里插入图片描述

获取单个的成员变量:

getField():获取公共的单个成员变量
getDeclaredField():获取单个成员变量
package JavaAPI.FanShe.Test1.ch02;

import java.lang.reflect.Field;

/**
 * 反射获取对象的变量
 */
public class Test3 {
    public static void main(String[] args) throws Exception {
        Class<?> c = Class.forName("JavaAPI.FanShe.Test1.ch01.Student");
        /**
         * 获取到的单个公共变量
         */
        System.out.println("获取到的单个公共变量为:");
        Field field = c.getField("sex");
        System.out.println(field);

        System.out.println("-------");
        /**
         * 获取到的单个私有变量
         */
        System.out.println("获取到的单个私有变量为:");
        Field name = c.getDeclaredField("name");
        System.out.println(name);
        System.out.println("-------");

    }
}

在这里插入图片描述

获取单个成员对象并赋值:

获取公共成员变量赋值 set
System.out.println("获取到的单个公共变量为:");
Field field = c.getField("sex");
System.out.println(field);
Constructor<?> s1 = c.getConstructor(); //获取公共无参构造方法
Object o1 = s1.newInstance();	//创建无参方法构造对象
field.set(o1,"男");			//给o1中的sex属性赋值
System.out.println(o1);
System.out.println("-------");

在这里插入图片描述

获取成员变量赋值Field下的setAccessible(true); 方法
        /**
         * 获取到的单个私有变量
         */
        System.out.println("获取到的单个私有变量为:");
        Field name = c.getDeclaredField("name");
        System.out.println(name);
        Constructor<?> s2 = c.getDeclaredConstructor();     //获取公共无参构造方法
        name.setAccessible(true);       //暴力赋值
        Object o = s2.newInstance();  //创建无参方法构造对象
        name.set(o,"小王");       //给o1中的name属性赋值
        System.out.println(o);
        System.out.println("-------");

在这里插入图片描述

反射获取成员方法

在这里插入图片描述

反射获取所有的成员方法

getMethods():获取到的所有方法(不包括私有的,包括所继承的)
getDeclaredMethods():所有的本类的方法(包括私有的)

学生类:

package JavaAPI.FanShe.Test1.ch01;

import java.util.Objects;

public class Student {
    private String name;
    private int age;
    public String sex;
    Integer idNum;

    public Student() {
    }

    private Student(String name) {
        this.name = name;
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public void show1() {
        System.out.println("public----show1");
    }

    private void show2() {
        System.out.println("private----show2");
    }

    public String show3(String s) {
        System.out.println("public----String----show3");
        System.out.println("参数为"+s);
        return s;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", idNum=" + idNum +
                '}';
    }
}

测试类:

package JavaAPI.FanShe.Test1.ch02;

import java.lang.reflect.Method;

/**
 * 反射获取成员方法
 */
public class Test4 {
    public static void main(String[] args) throws Exception {
        Class<?> c = Class.forName("JavaAPI.FanShe.Test1.ch01.Student");
        /**
         * 返回所有的方法包括所继承的和实现的
         */
        System.out.println("获取到的所有方法(不包括私有的)");
        Method[] methods = c.getMethods();
        for (Method method:methods)
            System.out.println(method);
        System.out.println("----------");
        /**
         * 返回所有的私有方法包括所继承的和实现的
         */
        System.out.println("获取到的所有私有方法");
        Method[] methods1 = c.getDeclaredMethods();
        for (Method method:methods1)
            System.out.println(method);
        System.out.println("----------");
    }
}

在这里插入图片描述

反射获取单个的成员方法并使用

获取单个公共对象的方法getMethod(方法名称,参数);

获取单个公共的方法getDeclaredMethod(方法名称,参数);

调用方法invoke(o,参数);

无参方法:

示例:

/**
 * 反射获取到的单个方法
 */
System.out.println("获取无参,public,无返回值的方法show1");
Method m = c.getMethod("show1");  //反射获取单个方法
Constructor<?> s1 = c.getConstructor();  //获取对象
Object o = s1.newInstance();        //无参构造创建对象
m.invoke(o);

在这里插入图片描述

带参有返回值:
/**
 * 反射获取到的单个带参方法
 */
System.out.println("获取带参,public,有返回值的方法show3");
Method show3 = c.getMethod("show3", String.class);//反射获取单个方法
Constructor<?> s3 = c.getConstructor();  //获取对象
Object o3 = s3.newInstance();        //无参构造创建对象
Object fanhui = show3.invoke(o3, "show3");      //获取返回值
System.out.println(fanhui);

在这里插入图片描述

私有的方法:
/**
 * 反射获取到的单个私有方法
 */
System.out.println("获取无参,private,无返回值的方法show2");
Method m2 = c.getDeclaredMethod("show2");  //反射获取单个方法
m2.setAccessible(true);
Constructor<?> s2 = c.getConstructor();  //获取对象
Object o2 = s2.newInstance();        //无参构造创建对象
m2.invoke(o2);

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛总来学习了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值