Java框架--反射

一.反射是什么

反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。

Oracle 官方对反射的解释是:

Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions. The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class. It also allows programs to suppress default reflective access control.

简而言之,通过反射,我们可以在运行时获得程序或程序中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。

反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。

二.反射的作用

  • 运行时判断任意一个对象所属的类;

  • 运行时创建任意一个类的对象;

  • 运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);

  • 运行时调用任意一个对象的方法。

三.反射的使用

1.获取class类

获取Class的方法有三种:

  1. 直接获取某个类的class

    Class<Person> personClass = Person.class;
  2. 调用某个对象的getClass()方法

    Person person = new Person();
    Class<? extends Person> personClass = person.getClass();
  3. 调用Class类的forName()静态方法

               Class<?> personClass = Class.forName("entity.Person"); 

2.生成实例对象

  1. 调用Class对象的newInstance()方法
    • Person person = personClass.newInstance();
    • 通过获取类的构造方法进行实例化

      • 无参构造

        Constructor<Person> constructor = personClass.getConstructor();
        Person person = constructor.newInstance();
      • 有参构造

        Constructor<Person> constructor = personClass.getConstructor(String.class, int.class);
        Person person = constructor.newInstance("tom", 18);
        

              3. 访问属性

                        1.访问公有属性

                                // 获取age属性
                                Field ageField = personClass.getField("age");
                                // 获取person对象的age属性值
                                Object age = ageField.get(person);
                                System.out.println(age);


                                //将person对象的age属性值设置为20
                                ageField.set(person,20);
                                System.out.println(person.age);

                        2.访问私有属性、

                            

                                // 获取私有的name属性
                                Field nameField = personClass.getDeclaredField("name");
                                // 将name属性的可访问性设置为true
                                nameField.setAccessible(true);
                                // 获取person对象的name属性值
                                Object name = nameField.get(person);
                                System.out.println(name);

                                // 将person对象的name属性值设置为jerry
                                nameField.set(person,"jerry");
                                System.out.println(person.getName());

            4.调用方法

                        1.访问公有方法  

       

                                // 获取getName()方法
                                Method getName = personClass.getMethod("getName");//getMethod(

                                方法名,参数列表)
                                // 通过person对象调用getName()方法,并获取执行结果
                                Object name = getName.invoke(person);
                                System.out.println(name);


                                // 获取setName()方法
                                Method setName = personClass.getMethod("setName", String.class);
                                // 通过person对象调用setName()方法,并传递参数
                                setName.invoke(person,"trump");
                                System.out.println(person.getName());

                         2.访问私有属性

                                // 获取私有的playGame()方法
                                Method playGame = personClass.getDeclaredMethod("playGame");
                                // 将playGame()方法的可访问性设置为true
                                playGame.setAccessible(true);
                                // 通过person对象调用playGame()方法
                                playGame.invoke(person);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值