5分钟带你了解,JAVA反射机制!!!简单易懂

百度百科:Java的反射(reflection)机制

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

正题

一、在学习反射前,我们先了解下class Class这个类,它在java.lang包下,是所有反射的源头!

  • java.lang.Class类
  • 1、Class类是用来描述Xxxx类的
  • 2、Class类的对象只能由系统构建
  • 3、Class类的对象封装了Xxxx类的详细信息
class Class<T>{} (它描述类的类,它的对象只能由系统去构建,并且这个对象封装了描述类的详细信息)
         
class Xxxx{} (JDK内置类与我们的自定义类,都是被它描述的类)

二、类加载过程

  • Class对象
  • 1、Class对象与Xxxx类一 一对应关系
一个.java文件  “通过Java编译器javac编译成”  .class字节码文件  “通过类加载器”  加载到内存中:此时在java内存方法区中,会产生一个对应的Class对象,就是那个由系统构建的Class对象!

三、获取某个类的Class对象

    @SneakyThrows
    public static void main(String[] args) {
        //1. 指定类.class
        Class c1 = Person.class;
        //2. 指定类的实例.getClass()
        Person person = new Person();
        Class c2 = person.getClass();
        //3. Class.forName(指定类的全限定类名)
        Class c3 = Class.forName("com.baijun.utils.test.Person");
    }

四、反射

    @SneakyThrows
    public static void main(String[] args) {
        //获取Class对象
        Class c1 = Person.class;
        //获取完整包类名
        System.out.println(c1.getName());
        //获取类名
        System.out.println(c1.getSimpleName());
        //获取类的全部属性
        Field[] fields = c1.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        //获取指定属性的值
        Field name = c1.getDeclaredField("name");
        System.out.println(name);
        //获取本类及父类的全部方法
        Method[] methods = c1.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        //获取指定方法
        Method getMethod = c1.getMethod("getName");
        System.out.println(getMethod);
        //获取全部构造方法
        Constructor[] constructors = c1.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
        //获取指定构造方法
        Constructor constructor = c1.getDeclaredConstructor(String.class);
        System.out.println(constructor);
    }
类加载器:每个类加载器,都负责管理一片范围类的加载,可通过Class对象.getClassLoader()方法,知道是由哪个加载器负责。
            1.系统加载器:sun.misc.Launcher$AppClassLoader@18b4aac2
            ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
            2.系统加载器的父类之扩展加载器:sun.misc.Launcher$ExtClassLoader@2d98a335
            ClassLoader parent = systemClassLoader.getParent();
            3.扩展加载器的父类之根加载器:是由C++编写的,我们无法直接获取所以是nul
            ClassLoader parentRoot = parent.getParent();
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码飓风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值