Java学习:反射1


在Java编程中,反射是一种强大的机制,它允许程序在运行时访问、检查和修改类和对象的信息。通过反射,我们可以在不硬编码类名的情况下动态地创建对象、调用方法和访问属性。这使得程序具有更高的灵活性和可扩展性。本文将介绍Java反射的基本概念、常用API以及一个简单示例。

一、基本概念

  1. 类加载器(ClassLoader):负责将字节码文件加载到内存中,生成对应的Class对象。
  2. Class对象:表示一个类或接口在运行时的实例,包含了类的结构信息,如构造方法、成员变量、成员方法等。
  3. 反射:通过Class对象获取类的结构信息,动态地创建对象、调用方法和访问属性的过程。

二、常用API

  1. 获取Class对象
// 方式1:通过Class.forName()方法,传入类的全限定名(包名+类名)
Class clazz1 = Class.forName("java.lang.String");

// 方式2:通过对象的getClass()方法
String str = "Hello, world!";
Class clazz2 = str.getClass();

// 方式3:通过类名.class语法
Class clazz3 = String.class;
  1. 创建对象
// 通过Class对象的newInstance()方法创建对象
Object obj = clazz1.newInstance();

// 或者通过Constructor对象的newInstance()方法创建对象
Constructor constructor = clazz1.getConstructor(String.class);
Object obj2 = constructor.newInstance("Hello, world!");
  1. 调用方法
// 获取Method对象
Method method = clazz1.getMethod("substring", int.class, int.class);

// 调用方法
String result = (String) method.invoke(obj2, 0, 5);
  1. 访问属性
// 获取Field对象
Field field = clazz1.getDeclaredField("value");

// 设置访问权限
field.setAccessible(true);

三、示例
假设我们有一个学生类Student和一个课程类Course,如下所示:


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

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

    public void study(Course course) {
        System.out.println(name + "正在学习" + course.getName());
    }
}

public class Course {
    private String name;

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

    public String getName() {
        return name;
    }
}


现在我们使用反射来实现动态创建对象和调用方法:

public static void main(String[] args) throws Exception {
    // 获取Student类和Course类的Class对象
    Class studentClass = Class.forName("Student");
    Class courseClass = Class.forName("Course");

    // 创建Student对象和Course对象
    Student student = (Student) studentClass.getConstructor(String.class, int.class).newInstance("张三", 18);
    Course course = (Course) courseClass.getConstructor(String.class).newInstance("计算机科学");

    // 调用Student对象的study方法
    Method studyMethod = studentClass.getMethod("study", courseClass);
    studyMethod.invoke(student, course);
}

运行上述代码,输出结果为:

张三正在学习计算机科学

通过这个示例,我们可以看到反射的强大之处,可以在不硬编码类名的情况下动态地创建对象、调用方法和访问属性。但需要注意的是,反射操作相对耗时,应尽量避免在性能敏感的场景下使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值