Java中的反射

目录

一、反射的概念

二、反射的用处

三、反射的优缺点

四、反射的实现方法

五、Java反射有关的类

六、反射常用的方法


一、反射的概念

 (1)、Java的反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法;对于任意一个对象,都能够调用它的任何方法和属性。这种动态获取类的信息以及动态调用方法的功能称为Java语言的反射(reflection)机制。

(2)、Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁

二、反射的用处

1、java语言中的很多地方都用到了反射比如说:当我们new出一个类的对象,可以通过对象点idea就可以提示你可以调用它的属性和方法,这里就用到了反射

2、在项目开发时我们会使用一些xml配置文件,他们可能需要根据配置文件加载不同的类或者对象,调用不同的方法,这个时候就必须使用到反射了,运行时动态加载需要的加载的对象

三、反射的优缺点

Java反射的优点是它提供了动态操作类和对象的能力,使得代码更加灵活和通用。

缺点包括性能损耗、类型安全性降低以及增加了代码复杂性和难以维护性。

四、反射的实现方法

        //进行反射有三种方法
//        1.通过Class.forName,拿到该类的全类名(包名+类名)
        Class aClass = Class.forName("edu.sias.Student");
//    2.通过类名.class来进行反射
        Class aClass1 = Student.class;
        //3.需要通过该类的对象来进行获取
        Student student = new Student();
        Class aClass2 = student.getClass();

五、Java反射有关的类

Class类:反射的核心类,用于获取类的各种信息,比如类名、构造方法、成员变量、成员方法

Constructor类:用于描述类的构造方法。

Method类:用于描述类的成员方法。

Field类:用于描述类的成员变量。

反射的方法来获取类的属性,方法,类名,异常以及权限(就是说这个类在反射的情况下就是透明的,可以通过方法获取到这个类当中的一切)

(1)创建一个实体类,类中填写一些属性,不同权限的方法

package edu.sias;

public class Student {
    private String name;
    private Integer age;

    public Student() {
    }

    public Student(String name) {
        this.name = name;
    }

    //私有的
    private Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 (2)、创建一个测试类用来反射这个类调用方法来获取这个类的一切

 //获取构造方法
        //1.获取参数相同公共的一个构造方法
        Constructor constructor = aClass.getConstructor();
        //2.获取所有的公共构造方法
        Constructor[] constructors = aClass.getConstructors();
        //3.获取参数类型相同的带权限的构造方法
        Constructor declaredConstructor = aClass.getDeclaredConstructor(String.class,Integer.class);
        //4.获取所有的构造方法,不管带什么权限
        Constructor[] declaredConstructors = aClass.getDeclaredConstructors();

        //获取类的全类名,构造方法与类名是相同的
        String name = declaredConstructor.getName();
        System.out.println(name);
        //获取方法的修饰权限
        int modifiers = declaredConstructor.getModifiers();
        System.out.println(modifiers);
        //获取方法所有参数的类型
        Class[] parameterTypes = declaredConstructor.getParameterTypes();
        for (Class parameterType : parameterTypes) {
            System.out.println(parameterType);
        }


        //临时取消权限的校验
        declaredConstructor.setAccessible(true);
        //通关构造方法去new对象,强转为Student类型的对象
        Student student1 = (Student) declaredConstructor.newInstance("张三", 10);
        System.out.println(student1);

(3)、获取到方法后,方法本身的方法

//获取字节码文件
        Class aClass = Class.forName("edu.sias.reflection1.person");
        //通过生成的对象去获取成员方法
        Method[] methods = aClass.getDeclaredMethods();
        for (Method method : methods) {
            //获取方法本身
            System.out.println(method);
            //获取方法的名字
            System.out.println(method.getName());
            //获取方法的修饰权限
            System.out.println(method.getModifiers());
            //获取方法抛出异常的类型
            System.out.println(method.getExceptionTypes());
            //获取方法的参数
            System.out.println(method.getParameters());
            System.out.println("============================");
        }
        //获取到方法来通过对象来调用方法
        Method method = aClass.getDeclaredMethod("eat", String.class);
        method.setAccessible(true);
        //获取到吃方法,可以调用私有的方法来传参执行
        person person = new person();
        method.invoke(person,"鸡肉");

(4)、运行结果

六、反射常用的方法

1、class类相关方法:

  1. 获取Class对象:使用getClass()方法或者ClassName.class语法来获取类的Class对象。
  2. 获取类的构造方法:使用getConstructor()getDeclaredConstructor()方法。
  3. 获取类的字段:使用getField()getDeclaredField()方法。
  4. 获取类的方法:使用getMethod()getDeclaredMethod()方法。
  5. 调用对象的方法:使用Method类的invoke()方法。
  6. 获取方法抛出的异常:使用getExceptionTypes()方法

2、Constructor 相关方法

  1. 获得public的构造器:getConstructors()
  2. 获得所有的构造器     getDeclaredConstructor()
  3. 获得指定类型的构造器:getDeclaredConstructor(Class<>>... parameterTypes) 
  4. 获得构造方法的名字: getName()

3、Field类相关方法

  1.  获取指定name的字段对象:getDeclaredField(String name)
  2. 获得所有的字段:getDeclaredField()
  3. 获得指定且是public修饰的:getField(String name)
  4. 获得所有的公共的field:getField()

4、Method类相关方法

  1.   获得指定参数和name的方法:getDeclaredMethod(String name, Class<?>/// parameterTypes)
  2. 获得类中所有的方法:getDeclaredMathod()
  3. 获得公共的参数和name的方法:getMethod(String name, Class<?>... parameterTypes)
  4. 获得公共的所有方法:getMethods()
  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值