java反射学习---(框架设计的灵魂,你不收藏都后悔)


点进来的小伙伴,都是爱,要是再点个赞那就更感激不尽了。

一、反射的定义

  • 官方的解释:

Java的反射( reflection )机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键

  • 我的解释:

反射其实就是一面镜子,类的一个镜子,就像我们每天早上照的镜子,将类的所有情况都看的一清二楚,并将每个部分又单独的封装成一个各自的类,然后这面镜子就是类对象

如果感觉羞涩难懂,那你看看代码就明白了

二、反射常用的方法

  • java代码的三个阶段
    在这里插入图片描述
  • 获取Class对象的方式
    在这里插入图片描述
  • Class对象的常见功能(API)
    在这里插入图片描述

三、撸代码(都有解释)

(1) 获取类对象

Teacher类

package chen.com.reflex_study;

/**
 * java反射的学习:
 *  author:放牛娃学编程
 *  公众号:放牛娃学编程(精彩文章都在这)
 */
public class Teacher {
    private String sex;
    private int age;
    private int height;
    public int salary;
    public int subject;

    public Teacher(String sex, int age, int height) {
        this.sex = sex;
        this.age = age;
        this.height = height;
    }

    public Teacher() { }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getSalary() {
        return salary;
    }

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

    public int getSubject() {
        return subject;
    }

    public void setSubject(int subject) {
        this.subject = subject;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "sex='" + sex + '\'' +
                ", age=" + age +
                ", height=" + height +
                ", salary=" + salary +
                ", subject=" + subject +
                '}';
    }

    public void run(int koilemeter) {
        System.out.println("我可是"+koilemeter+"跑步冠军哟!");
    }
}

获取构造器

package chen.com.reflex_study;

/**
 * java反射的学习:
 *  author:放牛娃学编程
 *  公众号:放牛娃学编程(精彩文章都在这)
 */

public class ReflexTest {
    public static void main(String[] args) throws Exception {
        // 获取类对象,有三种方式
        /**
         * 1. Class.forName(str), str时要反射类的全限定类名
         * 2. 类名.class , 类名指的时需要反射的类名
         * 3. 对象.getClass(), getClass()方法在Object类中定义
         */

        // 1. Class.forName(str), str时要反射类的全限定类名
        Class cls = Class.forName("chen.com.reflex_study.Teacher");
        System.out.println("cls = " + cls);

        System.out.println("-----------------");

        // 2. 类名.class , 类名指的时需要反射的类名
        Class cls2 = Teacher.class;
        System.out.println("cls2 = " + cls2);

        System.out.println("-----------------");

        // 3. 对象.getClass(), getClass()方法在Object类中定义
        Teacher teacher = new Teacher();
        Class cls3 = teacher.getClass();
        System.out.println("cls3 = " + cls3);

        System.out.println((cls == cls2));
        System.out.println((cls2 == cls3));
    }
}
(2) 获取构造器
package chen.com.reflex_study;

import java.lang.reflect.Constructor;

/**
 * java反射的学习:
 *  author:放牛娃学编程
 *  公众号:放牛娃学编程(精彩文章都在这)
 */
public class ReflexTest02 {
    public static void main(String[] args) throws Exception {
        // 通过获取到的类对象,再获取其它相应的东西(比如成员变量,方法,构造器)
        // 1. 获取构造器
        /**
         * a. Constructor<?>[] getConstructors()
         *  返回一个数组包含 Constructor物体反射所有的 类对象表示的类的公共构造函数
         * b. Constructor<T> getConstructor(类<?>... parameterTypes)
         *  返回一个 Constructor对象反映指定的公共构造函数的 类对象表示的类。
         * c. Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
         *  返回一个 Constructor对象反映指定的构造函数的类或接口的 类对象表示。
         * d. Constructor<?>[] getDeclaredConstructors()
         *  返回 Constructor物体反射所有的构造函数通过 类对象表示的类中声明一个数组。
         */
        Class teacherClass = Teacher.class;
        // b. 获取构造器
        Constructor constructor = teacherClass.getConstructor();
        // 用构造器创建对象
        Object o = constructor.newInstance();
        System.out.println("o = " + o);

        System.out.println("-----------------");

        // b. 获取带参构造器
        Constructor constructor1 = teacherClass.getConstructor(String.class, int.class, int.class);
        Object o1 = constructor1.newInstance("老王八", 28, 180);
        System.out.println("o1 = " + o1);

        System.out.println("-----------------");

        // d. 返回所有构造器函数
        Constructor[] cons = teacherClass.getDeclaredConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }
    }
}
(3) 获取成员变量
package chen.com.reflex_study;

import java.lang.reflect.Field;

/**
 * java反射的学习:
 *  author:放牛娃学编程
 *  公众号:放牛娃学编程(精彩文章都在这)
 */
public class ReflexTest03 {
    public static void main(String[] args) throws Exception {
        // 2. 获取成员变量
        /**
         * a. Field getField(String name)
         *  返回一个 Field对象反映的类或接口的 类对象表示的指定公共成员。
         * b. Field[] getFields()
         *  返回一个数组包含 Field物体反射的类或接口的 类对象代表所有可访问的公共领域
         * c. Field getDeclaredField(String name)
         *  返回一个对象,反映了 Field指定声明字段的类或接口的 类对象表示。
         * d. Field[] getDeclaredFields()
         *  返回 Field物体反射所有字段的类或接口的 类对象表示声明数组。
         */

        // 获取类对象
        Class teacherClass = Teacher.class;
        // b. Field[] getFields(), 私有的不能够访问
        Field[] fields = teacherClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        System.out.println("-------------");

        // d. Field[] getDeclaredFields()
        Field[] fields1 = teacherClass.getDeclaredFields();
        for (Field field : fields1) {
            System.out.println(field);
        }

        // 用获取到的成员变量, 然后进行赋值操作
        Field salary = teacherClass.getField("salary");
        Teacher teacher = new Teacher();
        // 获取值
        Object o = salary.get(teacher);
        System.out.println("teacher.getSalary() = " + o);
        // 赋值
        salary.set(teacher,5800);
        System.out.println("teacher.getSalary() = " + teacher.getSalary());

        System.out.println("-------------");

        // 暴力反射(获取私有属性)
        Field sex = teacherClass.getDeclaredField("sex");
        sex.setAccessible(true);
        sex.set(teacher,"female");
        System.out.println("teacher.getSalary() = " + teacher.getSex());
    }
}
(4)获取成员方法
package chen.com.reflex_study;

import java.lang.reflect.Method;

/**
 * java反射的学习:
 *  author:放牛娃学编程
 *  公众号:放牛娃学编程(精彩文章都在这)
 */
public class ReflexTest04 {
    public static void main(String[] args) throws Exception {
        // 获取成员方法
        /**
         * a. Method getMethod(String name, 类<?>... parameterTypes)
         *  返回一个 方法对象反映的类或接口的 类对象表示的指定公共成员方法。
         * b. Method[] getMethods()
         *  返回一个数组包含 方法物体反射所有的类或接口的 类对象表示的公共方法,包括那些由类或接口的超类和超接口继承的声明。
         * c. Method getDeclaredMethod(String name, 类<?>... parameterTypes)
         * 返回一个 方法对象反映指定声明方法的类或接口的 类对象表示。
         * d. Method[] getDeclaredMethods()
         * 返回一个数组包含 方法物体反射所有声明的方法的类或接口的 类对象,代表包括公众、保护,默认(包)的访问,和私有方法,但不包括继承的方法。
         */

        // 获取类对象
        Class<Teacher> teacherClass = Teacher.class;
        // b. Method[] getMethods()
        Method[] methods = teacherClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

        System.out.println("-------------------");
        // 获取方法
        Method method = teacherClass.getMethod("run", int.class);
        // 执行方法
        Teacher teacher = new Teacher();
        method.invoke(teacher, 1000);
    }
}

四、分享交流

最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧,不是常用的我不说,公众号回复提取码即可获取以下学习资料啦啦啦啦,喜欢就拿去吧!!

(链接时常会失效,若出现此类情况,可以加我微信:17722328325(加时请备注:学习资料))

  1. Java web从入门到精通电子书

  2. Python机器学习电子书

  3. Python400集(北京尚学堂)

  4. JavaScript项目案例、经典面试题

  5. Java300集(入门、精通)

  6. Java后端培训机构录集(同事培训内部提供)

  7. java重要知识pdf文档(价值连城呀呀,不收藏你会后悔的)



        喜欢就关注吧,点个赞吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值