JAVA里的反射(详解)

1. 反射

 

         

1.1 反射的概述:

专业的解释(了解一下):

是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意属性和方法;

这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

通俗的理解:(掌握)

  • 利用反射创建的对象可以无视修饰符调用类里面的内容

  • 可以跟配置文件结合起来使用,把要创建的对象信息和方法写在配置文件中。

    读取到什么类,就创建什么类的对象

    读取到什么方法,就调用什么方法

    此时当需求变更的时候不需要修改代码,只要修改配置文件即可。

1.2 学习反射到底学什么?

反射都是从class字节码文件中获取的内容。

  • 如何获取class字节码文件的对象

  • 利用反射如何获取构造方法(创建对象)

  • 利用反射如何获取成员变量(赋值,获取值)

  • 利用反射如何获取成员方法(运行)

1.3 获取字节码文件对象的三种方式

  • Class这个类里面的静态方法forName(“全类名”)(最常用)

  • 通过class属性获取

  • 通过对象获取字节码文件对象

代码示例:

package fangse01;

public class Test {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
        获取class文件对象的三种方式
        1. Class.forName("全类名")
        2. 类名.class
        3. 对象.getClass()
         */

        //1.第一种方式
        //全类名:包名+类名
        //最常用
        Class clazz1 = Class.forName("fangse01.Student");
        System.out.println(clazz1);

        //2.第二种方式
        Class clazz2 = Student.class;
        System.out.println(clazz2);

        //3.第三种方式
        Student s = new Student();
        Class clazz3 = s.getClass();
        System.out.println(clazz3);

        //判断三个对象是否相同
        System.out.println(clazz1 == clazz2);
        System.out.println(clazz1 == clazz3);
        System.out.println(clazz2 == clazz3);
    }
}

1.4 字节码文件和字节码文件对象

java文件:就是我们自己编写的java代码。

字节码文件:就是通过java文件编译之后的class文件(是在硬盘上真实存在的,用眼睛能看到的)

字节码文件对象:当class文件加载到内存之后,虚拟机自动创建出来的对象。

这个对象里面至少包含了:构造方法,成员变量,成员方法。

而我们的反射获取的是什么?字节码文件对象,这个对象在内存中是唯一的。

1.5 获取构造方法

Constructor构造方法的对

规则:

get表示获取

Declared表示私有

最后的s表示所有,复数形式

如果当前获取到的是私有的,必须要临时修改访问权限,否则无法使用

方法名 说明
Constructor<?>[] getConstructors() 获得所有的构造(只能public修饰)
Constructor<?>[] getDeclaredConstructors() 获得所有的构造(包含private修饰)
Constructor<T> getConstructor(Class<?>... parameterTypes) 获取指定构造(只能public修饰)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取指定构造(包含private修饰)

代码示例:

public class ReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        //1.获得整体(class字节码文件对象)
        Class clazz = Class.forName("com.itheima.reflectdemo.Student");
​
​
        //2.获取构造方法对象
        //获取所有构造方法(public)
        Constructor[] constructors1 = clazz.getConstructors();
        for (Constructor constructor : constructors1) {
            System.out.println(constructor);
        }
​
        System.out.println("=======================");
​
        //获取所有构造(带私有的)
        Constructor[] constructors2 = clazz.getDeclaredConstructors();
​
        for (Constructor constructor : constructors2) {
            System.out.println(constructor);
        }
        System.out.println("=======================");
​
        //获取指定的空参构造
        Constructor con1 = clazz.getConstructor();
        System.out.println(con1);
​
        Constructor con2 = clazz.getConstructor(String.class,int.class);
        System.out.println(con2);
​
        System.out.println("=======================");
        //获取指定的构造(所有构造都可以获取到,包括public包括private)
        Constructor con3 = clazz.getDeclaredConstructor();
        System.out.println(con3);
        //了解 System.out.println(con3 == con1);
        //每一次获取构造方法对象的时候,都会新new一个。
​
        Constructor con4 = clazz.getDeclaredConstructor(String.class);
        System.out.println(con4);
    }
}
package fangseo2;

import java.lang.reflect.Constructor;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值