Java基础-反射机制的作用

Java反射机制

  1. 什么是反射?
    答:将一个java类的各个部分封装为其他对象的机制
  2. 反射有什么好处,为什么要使用反射?
    答:一是可以解耦,提高程序的可重用性;二是方便程序在操作中使用这些对象;三是反射是框架的核心
程序在计算机中的三个阶段

在这里插入图片描述

获取字节码的三种方式
  1. 通过Class.forName(“全类名”)
  2. 类名.class
  3. 对象.getClass()
package com.quan.practice;

import com.quan.bean.Person;

public class ReflectTest {

    public static void main(String[] args) throws ClassNotFoundException {

        // 1. 通过全类名的方法获取Class对象
        Class cls1 = Class.forName("com.quan.bean.Person");

        // 2. 通过类名.class获取Class对象
        Class cls2 = Person.class;

        // 3. 通过对象.getClass()获取Class对象
        Person person = new Person();
        Class cls3 = person.getClass();

        // 结果都为真,因为Class对象只会被类加载器加载一次
        System.out.println(cls1 == cls2);
        System.out.println(cls1 == cls3);
    }
}

通过三种方法获取的Class对象都为同一个,因为Class对象只会被类加载器加载一次

获取成员变量对象

获取成员变量对象是为了设置和查看对象相应的成员变量值。

  1. 以下是获取成员变量的常用方法
// 获取Person类的访问限定符为public成员变量
Person.class.getField(String name);
// 获取Person类的某个成员变量
Person.class.getDeclaredField(String name);
// 获取Person类的所有访问限定符为public的成员变量
Person.class.getFields();
// 获取Person类所有的成员变量
Person.class.getDeclaredFields();
  1. 设置和访问对象相应的成员变量
public static void main(String[] args) throws Exception {

        // 获取访问限定符为public相应的成员变量
        Field publicNameField = Person.class.getField("publicName");

        Person person = new Person();

        System.out.println(person);

        // 设置person对象的publicName成员变量
        publicNameField.set(person, "quan");

        System.out.println(person);

        // 访问person对象的publicName成员变量
        System.out.println(publicNameField.get(person));
        
        // 非public成员变量无法调用get、set方法,如果需要调用get、set方法,需要设置可以访问性为true
        // publicNameField.setAccessible(true);
    }
获取构造方法对象

获取构造方法对象就是为了创建对象

        // 获取Person类的构造器
        Constructor<Person> personConstructor = Person.class.getConstructor(Integer.class, String.class, String.class);

        // 通过构造器创建对象
        Person person = personConstructor.newInstance(1, "quan", "quan");
获取成员函数对象

获取成员函数对象就是为了调用成员函数

public static void main(String[] args) throws Exception {

        // 获取public成员方法(有参数)
        Method sayHelloMethod = Person.class.getMethod("sayHello", String.class);
        // 无参数 
        // Method sayHelloMethod = Person.class.getMethod("sayHello");

        Person person = new Person();
        
        // 调用成员方法
        sayHelloMethod.invoke(person, "Hacker");
    }
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值