反射摘要

本文深入探讨了Java反射机制,包括如何获取类对象、通过反射获取类信息以及如何利用反射进行实例化、调用方法和修改属性。通过示例代码展示了getConstructors、getMethods、getField等方法的使用,阐述了反射在实际开发中的重要作用。
摘要由CSDN通过智能技术生成

反射

1.获取类对象

说明:User继承了Person

User user=new User();
        //1.通过对象获取,getClass()
        Class c1=user.getClass();
        System.out.println(c1);

        //2.通过Class.forName(会抛出一个异常)
        Class c2=Class.forName("reflection.User");
        System.out.println(c2);

        //3.通过类名获取
        Class c3=User.class;
        System.out.println(c3);

        //4.基本类型可以通过TYPE获取
        Class c4 = Character.TYPE;
        System.out.println(c4);

        //5.获取父类类型
        Class c5 = c1.getSuperclass();
        System.out.println(c5);

运行结果

在这里插入图片描述

2.通过反射获取类的信息

//获得类名
        c1.getName();
        c1.getSimpleName();

        //获得属性
        Field []fields=c1.getFields();//获得当前类以及超类的public Field
        Field[] declaredFields = c1.getDeclaredFields();//获得当前类申明的所有Field
        //Field name = c1.getField("name");//获取当前类以及超类指定public属性
        //Field name1 = c1.getDeclaredField("name");//获取当前类申明的指定属性
        for (Field field : fields) {
            System.out.println("public属性:"+field);
        }
        System.out.println("======================");
        for (Field declaredField : declaredFields) {
            System.out.println("所有属性:"+declaredField);
        }
        System.out.println("======================");

        //获得方法
        Method[] methods = c1.getMethods();//获得当前类以及超类的public Method
        Method[] declaredMethod = c1.getDeclaredMethods();//获得当前类申明的所有Method
        //Method setName = c1.getMethod("setName", String.class);//获得当前类以及超类的指定的public Method
        //Field siyou = c1.getDeclaredField("siyou");//获得当前类申明的指定Method
        for (Method method : methods) {
            System.out.println("所有的public方法:"+method);
        }
        System.out.println("======================");
        for (Method method : declaredMethod) {
            System.out.println("所有方法:"+method);
        }

运行截图

在这里插入图片描述

3.综合

//通过Class对象实例化一个User对象
        User user1 = (User) c1.newInstance();
        //通过构造器构造一个User对象
        Constructor constructor = c1.getConstructor();
        User user2 = (User) constructor.newInstance();
        //若构造器有参数则(该构造器含有一个int属性的参数)
        //Constructor constructor = c1.getConstructor(int.class);


        //通过反射调用方法
        Method setName = c1.getDeclaredMethod("setName", String.class);
        setName.invoke(user1,"lky");//使用invoke()方法其中传递的第一个参数的为需要调用方法的对象,之后的参数都是调用的方法需要的参数
        System.out.println(user1.getName());


        //通过反射改变属性
        Field name = c1.getDeclaredField("name");
        name.setAccessible(true);//setAccessible()用于关闭安全监测
        // setAccessible()方法不管是属性对象还是方法对象都有,
        // 将其中的值设置为true就可以操作私有的方法或者属性
        name.set(user1,"lky2");//用set()方法改变属性

        System.out.println(user1.getName());

运行截图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值