什么是反射?

反射

反射是在运行时动态地发现和使用类的信息的机制。Java 反射机制提供了程序在运行时拥有访问并操作任何一个对象、变量、方法的能力。

Java 反射最初被设计出来是为了支持类浏览器这样的工具。在此基础上,JavaBean等技术也得以广泛应用。

反射的使用

在Java中,使用反射需要经过如下基本步骤:
1. 获取需要使用的类的Class对象;
2. 根据Class对象获取构造方法、属性、方法等信息;
3. 使用获取到的构造方法、属性、方法等信息进行实例化、访问、操作等。

获取Class对象

在Java中,要获取某个对象的Class对象,可以使用Java反射提供的“类.class”语法或者“实例.getClass()”语法。示例如下:

Class clazz1 = String.class;
Class clazz2 = "hello".getClass();

System.out.println(clazz1);
System.out.println(clazz2);

输出结果:

class java.lang.String
class java.lang.String

获取构造方法

在Java中,可以使用反射获取指定类的构造方法。示例如下:

Class<?> clazz = String.class;
Constructor<?>[] constructors = clazz.getConstructors();
for (Constructor<?> constructor : constructors) {
    System.out.println(constructor);
}

输出结果:

public java.lang.String(byte[],java.nio.charset.Charset)
public java.lang.String(byte[],int,int,java.nio.charset.Charset)
public java.lang.String(byte[],java.lang.String) throws java.io.UnsupportedEncodingException
public java.lang.String(byte[],int,int,java.lang.String) throws java.io.UnsupportedEncodingException
public java.lang.String(byte[],int) throws java.io.UnsupportedEncodingException
public java.lang.String(byte[],int,int)
public java.lang.String(byte[])
public java.lang.String(java.lang.StringBuilder)
public java.lang.String(byte[],int,int,int)
public java.lang.String(int[],int,int)
public java.lang.String(byte[],int,int,java.nio.charset.CharsetEncoder)
public java.lang.String(char[],int,int)
public java.lang.String(byte[],int,int,java.lang.String,int[])
public java.lang.String()
public java.lang.String(int[],int,int,int)
public java.lang.String(java.lang.String,java.lang.String,java.lang.String)
public java.lang.String(java.lang.String)
public java.lang.String(java.lang.StringBuffer)
public java.lang.String(char[])
public java.lang.String(int[],int,int,int,int[])
public java.lang.String(java.lang.String,int)

获取属性

在Java中,可以使用反射获取指定类的属性。示例如下:

Class<?> clazz = String.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
    System.out.println(field);
}

输出结果:

private final char[] value
private final int offset
private final int count
public static final java.util.Comparator<java.lang.Object> CASE_INSENSITIVE_ORDER
public static final java.lang.String EMPTY
public static final char[] CA

获取方法

在Java中,可以使用反射获取指定类的方法。示例如下:

Class<?> clazz = String.class;
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
    System.out.println(method);
}

输出结果:

public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public int java.lang.String.compareTo(java.lang.Object)
public int java.lang.String.compareTo(java.lang.String)
public boolean java.lang.String.equals(java.lang.Object)
public java.lang.String java.lang.String.toString()
public native int java.lang.String.hashCode()
public int java.lang.String.length()
public int java.lang.String.indexOf(int)
public int java.lang.String.indexOf(java.lang.String)
public int java.lang.String.indexOf(int,int)
public java.lang.String java.lang.String.substring(int)
public java.lang.String java.lang.String.substring(int,int)
public char[] java.lang.String.toCharArray()
public byte[] java.lang.String.getBytes(java.nio.charset.Charset)
public byte[] java.lang.String.getBytes()
public boolean java.lang.String.endsWith(java.lang.String)
public boolean java.lang.String.equalsIgnoreCase(java.lang.String)
public int java.lang.String.indexOf(java.lang.String,int)
public boolean java.lang.String.isEmpty()
public java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)
public java.lang.String java.lang.String.replaceAll(java.lang.String,java.lang.String)
public java.lang.String java.lang.String.trim()
public boolean java.lang.String.contains(java.lang.CharSequence)
public int java.lang.String.lastIndexOf(int)
public int java.lang.String.lastIndexOf(java.lang.String)
public int java.lang.String.lastIndexOf(int,int)
public java.lang.String java.lang.String.toLowerCase()
public java.lang.String java.lang.String.toUpperCase()
public boolean java.lang.String.matches(java.lang.String)
public java.lang.String[] java.lang.String.split(java.lang.String,int)
public java.lang.String[] java.lang.String.split(java.lang.String)
public java.lang.String java.lang.String.valueOf(java.lang.Object)
public java.lang.String java.lang.String.valueOf(int)
public java.lang.String java.lang.String.valueOf(char[])
public java.lang.String java.lang.String.subSequence(int,int)
public java.util.Locale java.lang.String.getLocale()
public java.lang.String java.lang.String.intern()

示例

示例1:通过反射创建对象并调用方法

public class User {
    private String name;

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

    public void sayHello() {
        System.out.println("Hello, " + name + "!");
    }
}

public class Test {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        // 获取User类的Class对象
        Class<?> userClass = User.class;

        // 获取User类的构造方法
        Constructor<?> constructor = userClass.getConstructor(String.class);

        // 调用构造方法创建对象
        User user = (User) constructor.newInstance("Tom");

        // 获取User类的sayHello方法
        Method sayHelloMethod = userClass.getDeclaredMethod("sayHello");

        // 调用sayHello方法
        sayHelloMethod.invoke(user);
    }
}

输出结果:

Hello, Tom!

示例2:通过反射修改私有属性

public class User {
    private String name;

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

    public void sayHello() {
        System.out.println("Hello, " + name + "!");
    }
}

public class Test {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        // 创建User对象
        User user = new User("Tom");

        // 获取User类的Class对象
        Class<?> userClass = User.class;

        // 获取User类的name属性
        Field nameField = userClass.getDeclaredField("name");

        // 设置name属性可访问
        nameField.setAccessible(true);

        // 修改name属性的值
        nameField.set(user, "Jerry");

        // 调用sayHello方法
        user.sayHello();
    }
}

输出结果:

Hello, Jerry!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:什么是反射? - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • Java实现数据库连接池的方法

    Java实现数据库连接池是一种提高性能和应用程序响应能力的有效方法。下面为大家介绍几种常见的Java实现数据库连接池的方法。 使用Apache DBCP实现连接池 Apache DBCP是Java中最常用的开源连接池之一,它是一个开源项目,由Apache软件基金会支持。它使用轻量级语言Java实现,可以通过简单的配置使用。下面是使用Apache DBCP实现…

    Java 2023年5月19日
    00
  • 基于Java实现考试管理系统

    基于Java实现考试管理系统攻略 准备工作 首先,需要安装Java开发工具和MySQL数据库。常见的Java开发工具有Eclipse、IntelliJ IDEA等,可以根据个人喜好选择使用。同时还需要学习Java基础语法和SQL语句。 设计数据库表结构 考试管理系统需要存储的信息包括考生信息、考试科目信息、试卷信息、试题信息、考试成绩信息等。需要根据需求设计…

    Java 2023年5月19日
    00
  • java.lang.NumberFormatException异常解决方案详解

    Java.lang.NumberFormatException异常解决方案详解 什么是NumberFormatException异常? NumberFormatException异常是Java程序中常见的异常之一,表示将字符串转换为数字时出现错误。当字符串不符合数字格式或超出数字范围时,会抛出该异常。 解决方案 出现NumberFormatException…

    Java 2023年5月27日
    00
  • Java读取数据库表的示例代码

    以下是Java读取数据库表的完整攻略。 概述 在Java中,我们可以通过JDBC API来与关系型数据库进行交互。通过JDBC API,我们可以实现数据的增删改查等操作。本文将讲解如何使用Java读取数据库表的示例代码。 步骤 以下是使用Java读取数据库表的步骤: 步骤一:加载数据库驱动 在使用JDBC API之前,需要先加载相关的数据库驱动。可以使用Cl…

    Java 2023年5月26日
    00
  • Java Apache Commons报错“ClassCastException”的原因与解决方法

    当使用Java的Apache Commons类库时,可能会遇到“ClassCastException”错误。这个错误通常由以下原因之一起: 类型转换错误:如果类型转换错误,则可能会出现此错误。在这种情况下,需要检查类型转换以解决此问题。 类型不兼容:如果类型不兼容,则可能会出现此错误。在这种情况下,需要检查类型兼容性以解决此问题。 以下是两个实例: 例1 如…

    Java 2023年5月5日
    00
  • 详解SpringBoot通过restTemplate实现消费服务

    在Spring Boot中,我们可以使用RestTemplate来消费RESTful服务。RestTemplate是Spring框架提供的一个HTTP客户端,它可以发送HTTP请求并接收HTTP响应。在本攻略中,我们将详细介绍如何使用RestTemplate来消费服务,并提供两个示例来说明其用法。 以下是两个示例,介绍如何使用RestTemplate来消费服…

    Java 2023年5月15日
    00
  • Java 基础语法 异常处理

    Java 基础语法 异常处理 在Java编程中,异常处理是必不可少的部分。因为我们写的程序难免出现一些不可预见的情况,比如文件丢失、网络连接中断等等。这些情况,称之为异常。如果没有进行适当的处理,会导致程序的崩溃,影响整个程序的运行。因此,我们需要通过异常处理技术来保证程序的健壮性和可靠性。 异常的定义 异常是在程序中发生的不正常情况,它中断了程序的正常执行…

    Java 2023年5月23日
    00
  • 一文掌握Spring Boot 日志文件

    一文掌握Spring Boot日志文件 在Spring Boot应用程序中,日志文件是非常重要的。它们可以帮助我们诊断和解决问题,同时也可以提供有用的信息,例如应用程序的性能和行为。在本文中,我们将介绍如何配置和使用Spring Boot日志文件,并提供两个示例。 配置Spring Boot日志文件 Spring Boot支持多种日志框架,例如Logback…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部