什么是反射?

反射

反射是在运行时动态地发现和使用类的信息的机制。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垃圾回收器 Java垃圾回收器(Garbage Collector)是Java虚拟机(JVM)的重要组成部分。它管理内存分配和回收,以确保在应用程序运行期间,不会发生内存泄漏或溢出等问题。 垃圾回收器的工作原理 垃圾回收的核心是判断哪些内存块是“垃圾”,然后将其回收。在JVM中,垃圾回收器通过判断对象是否还被引用…

    Java 2023年5月26日
    00
  • Java解析XML(4种方式)案例详解

    Java解析XML(4种方式)案例详解 1. Java解析XML的概念 在Java开发中,我们经常需要读取和修改一些XML格式的文件。XML全称为Extensible Markup Language(可扩展标记语言),是W3C组织推出的标记语言。 XML是一种纯文本格式,用来描述数据。它通过标签的方式来组织数据,标签包含了属性和值,这些在XML文件中都可以很…

    Java 2023年5月19日
    00
  • Spring Security动态权限的实现方法详解

    Spring Security动态权限的实现方法详解 Spring Security 是一个基于 Spring 的安全框架,提供了一种基于角色的访问控制模型。但是在一些场景中,我们需要动态地控制用户的权限,这时候我们就需要实现 Spring Security 的动态权限控制。本文将详细介绍如何实现 Spring Security 动态权限的控制。 实现步骤 …

    Java 2023年6月3日
    00
  • 输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程

    下面是详细讲解“输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程”的完整攻略。 什么是jstack信息 jstack 是 JDK 自带的一款堆栈跟踪工具,用于查看 Java 进程中各个线程的运行状态以及占用资源情况。通过分析线程堆栈信息,可以快速定位代码中的性能问题,排查进程死锁等问题。 如何输出jstack信息 下面是输出 ja…

    Java 2023年5月26日
    00
  • Java easyexcel使用教程之导出篇

    Java easyexcel使用教程之导出篇攻略 背景介绍 在实际开发中,经常会涉及到将数据导出为Excel文件的需求。而 EasyExcel 是一款由阿里巴巴开源的Java Excel解析/生成工具包,使用简单,支持大量数据导出,广受开发者喜欢。 本篇攻略主要针对EasyExcel的导出功能进行详细讲解,包括使用方法、参数配置和示例说明等内容。 使用方法 …

    Java 2023年6月2日
    00
  • 从Java的jar文件中读取数据的方法

    从Java的jar文件中读取数据有多种方法,这里提供两个示例: 1. 使用Java自带的类库 Java中有自带的读取jar包中文件的方法,可以使用java.util.jar.JarFile类,在该类中提供了多个方法可以读取jar文件中的内容,例如下面的示例代码: import java.io.IOException; import java.io.Input…

    Java 2023年5月20日
    00
  • Java各种排序算法汇总(冒泡,选择,归并,希尔及堆排序等)

    Java各种排序算法汇总 本文将详细讲解Java中常见的各种排序算法,包括冒泡排序、选择排序、归并排序、希尔排序、堆排序等,以及他们的实现代码和时间复杂度分析。 冒泡排序 冒泡排序是一种基础的排序算法,核心思想是将相邻的元素两两比较,将较大的元素向后移动。代码如下: public static void bubbleSort(int[] array) { f…

    Java 2023年5月19日
    00
  • 如何将Java对象转换为JSON实例详解

    将Java对象转换成JSON是Java编程中非常常见的操作,可以使用许多不同的JSON库来实现这个过程。在这里,我将介绍使用常用的Jackson库来将Java对象转换为JSON对象的详细攻略。 步骤1:导入Jackson库 要使用Jackson库来转换Java对象为JSON,首先需要将其添加到项目中的类路径中。如果使用Maven管理你的项目,你可以在项目的P…

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