Java反射学习

本文详细介绍了Java中的反射机制,包括如何通过`Class`对象获取构造方法、成员变量和方法,以及不同获取方式的区别。反射在动态创建对象、配置文件驱动等场景中发挥重要作用。
摘要由CSDN通过智能技术生成

⚪什么是反射?
反射允许对成员变量,成员方法和构造方法的信息进行编程访问
俗话:(反射就是可以从类中拿东西—成员变量,成员方法,构造方法。就把这些东西挨个拿出来就是反射)

1. 获取class对象的三种方式

1.class.forName(“全类名”);

在这里插入图片描述

2.类名.class

在这里插入图片描述

3.对象.getClass();

在这里插入图片描述
例如项目下有个student类 位于 lianxi.com.Student

//最为常用的
Class clazz1 = Class.forName("lianxi.com.Student");

//一般更多的是当作参数进行传递,例如 锁
Class clazz2 = Student.class;

//当我们已经有了这个类的对象是才可以使用
Student s = new Student();
Class clazz3 = s.getClass();

//输出都是相同的

2.利用反射获取构造方法

Class类中用于获取构造方法的方法

Constructor<?>[] getConstructors() : 返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors() : 返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?>... parameterTypes) : 返回单个公共构造方法对象
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) : 返回单个构造方法对象

例子

public class fanshe {
    public static void main(String[] args) throws ClassNotFoundException {
        //1.获取class字节码文件对象
        Class clazz = Class.forName("student");

        //2.获取构造方法
        Constructor[] constructor = clazz.getConstructors();
        for (Constructor con : constructor) {
            System.out.println(con);
        }
        System.out.println("----------------------------");

        Constructor[] constructor2 = clazz.getDeclaredConstructors();
        for (Constructor con2 : constructor2) {
            System.out.println(con2);
        }
    }
}

在这里插入图片描述

利用反射获取成员变量

Class类中用于获取成员变量的方法

Field[] getFields(): 返回所有 公共 成员变量对象的数组
Field[] getDeclaredFields(): 返回所有成员变量对象的数组
Field getField(String name): 返回单个 公共 成员变量对象
Field getDeclaredField(String name): 返回单个成员变量对象

Field类中用于创建对象的方法

void set(Object obj,Object value):  赋值
Object get(Object obj):   获取值
public class fanshe2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        //1.获取class字节码文件对象
        Class clazz = Class.forName("student");

        //2.获取成员变量方法
        Field[] fields = clazz.getFields();
        for (Field f : fields) {
            System.out.println(f);      //输出为空,因为写的类里面两个成员变量都是 private 修饰的
        }
        System.out.println("-------------------------------");
        Field[] fields2 = clazz.getDeclaredFields();
        for (Field f : fields2) {
            System.out.println(f);      //输出为空,因为写的类里面两个成员变量都是 private 修饰的
        }
        System.out.println("--------------------------------");
        //获取单个的成员变量
        Field age = clazz.getDeclaredField("age");
        System.out.println(age);

        System.out.println("----------------------------------");
        //获取权限修饰符
        int modifiers = age.getModifiers();
        System.out.println(modifiers);

        System.out.println("---------------------");
        //获取成员变量的 名字
        String a = age.getName();             // 既然已经获得了age了 , 这样写不是多此一举吗???
        System.out.println(a);

        System.out.println("-----------------------------");
        //获取成员变量的 数据类型
        Class<?> type = age.getType();
        System.out.println(type);

    }
}

在这里插入图片描述

利用反射获取成员方法

Method[] getMethods() : 返回所有公共构造方法对象的数组
Method[] getDeclaredMethods() : 返回所有构造方法对象的数组
Method getMethod(String name,Class<?>... parameterTypes) : 返回单个公共构造方法对象
Method getDeclaredMethod(String name,Class<?>... parameterTypes) : 返回单个构造方法对象
Method类中用于创建对象的方法
Object invoke(Object obj,Object...args): 运行方法
参数一:用obj对象调用该方法
参数二:调用方法的传递的参数(如果没有就不写)
返回:方法的返回值(没有就不写)
public class fanshe3 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        //1.获取class字节码文件对象
        Class clazz = Class.forName("student");

        //2.获取里面所有的方法对象(包含父类中所有的公共方法)
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("--------------------------");
        2.获取里面所有的方法对象(不能获取父类中方法,但是可以获取本类中私有方法)
        Method[] methods2 = clazz.getDeclaredMethods();
        for (Method method : methods2) {
            System.out.println(method);
        }
        System.out.println("-------------------------------");
        Method setAge = clazz.getMethod("setAge", int.class);
        System.out.println(setAge);

        System.out.println("-------------------------------");
        Method getMethod = clazz.getDeclaredMethod("AB", int.class, String.class);
        System.out.println(getMethod);
    }
}

在这里插入图片描述

自己理解总结

第一步永远是 获取class字节码文件对象
第二布 就是通过该字节码文件对象调用相应的方法从而得到我们需要的 成员变量,构造方法,成员方法等等。

反射的作用

⚪ 获取一个类里面所有的信息,获取到了之后再执行其他的业务逻辑
⚪ 结合配置文件,动态的创建对象并调用方法

如何获取构造方法 成员方法 成员变量

get:获取
set:设置
Constructor:构造方法
Field: 成员变量
Method : 方法
Parameter: 参数
Modifiers: 修饰符
Declared : 私有的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值