反射、枚举、lambda表达式的使用

本文详细介绍了Java反射的基本概念、Class类的使用、如何获取和操作类的属性、构造方法、方法,以及枚举和Lambda表达式的应用,探讨了反射的优点和缺点以及其在编程中的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

反射

反射相关的类(重要)

获得Class对象的三种方式

Class类中的相关方法演示

(重要)常用获得类相关的方法

(重要)常用获得类中属性相关的方法

(重要)获得类中构造器相关的方法​编辑

(重要)获得类中方法相关的方法

反射优点和缺点

枚举

枚举的使用

枚举尝试反射

Lambda表达式

函数式接口

Lambda表达式的基本使用


反射

定义:Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的

所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那

么,我们就可以修改部分类型信息;这种动态获取信息以及动态调用对象方法的功能称

为java语言的反射(reflection)机制

反射基本信息:Java程序中许多对象在运行时会出现两种类型:运行时类型(RTTI)和编译时类型,

例如Person p = newStudent();这句代码中p在编译时类型为Person,运行时类型为Student。程序

需要在运行时发现对象和类的真实信息。而通过使用反射程序就能判断出该对象和类属于哪些类。


反射相关的类(重要)

Class类代表类的实体,在运行的Java应用程序中表示类和接口

Java文件被编译后,生成了.class文件,JVM此时就要去解读.class文件 ,被编译后的

Java文件.class也被JVM解析为 一个对象,这个对象就是java.lang.Class .这样当程序

在运行时,每个java文件就最终变成了Class类对象的一个实例。我们通过Java的反

射机制应用到这个实例,就可以去获得甚至去添加改变这个类的属性和动作,使得这

个类成为一个动态的类 


获得Class对象的三种方式

第一种,使用 Class.forName("类的全路径名"); 静态方法    前提:已明确类的全路径名

通过 Class 对象的 forName() 静态方法来获取,用的最多, 但可能抛出 

ClassNotFoundException 异常  注意这里是类的全路径,如果有包需要加包的路径

第二种,使用 .class 方法   说明:仅适合在编译前就已经明确要操作的 Class 

直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高 这说明任何一个

类都有一个隐含的静态成员变量 class

第三种,使用类对象的 getClass() 方法

一个类在 JVM 中只会有一个 Class 实例,即我们对上面获取的

代码图片演示:



Class类中的相关方法演示

首先定义一个学生类,然后下面进行演示

class Student {
    //私有属性name
    private String name = "bit";
    //公有属性age
    public int age = 18;

    //不带参数的构造方法
    public Student() {
        System.out.println("Student()");
    }

    private Student(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("Student(String,name)");
    }

    private void eat() {
        System.out.println("i am eat");
    }

    public void sleep() {
        System.out.println("i am pig");
    }

    private void function(String str) {
        System.out.println(str);
    }

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

(重要)常用获得类相关的方法

代码演示:

    public static void reflectNewInstance() {//newInstance()方法创建类的实例
        Class<?> classStudent = null;
        try {
            //获得Class对象
            classStudent = Class.forName("demo1.Student");
            //创建类的实例
            Student student = (Student) classStudent.newInstance();

            System.out.println(student);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值