Java反射机制基础详解

Java反射机制基础详解

Java反射机制是指在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法,在运行时刻可以调用任意一个方法或者访问任意一个属性,这种方法称之为反射机制。

反射机制主要涉及三个类:Class,Constructor和Method。

Class类

在Java反射机制中,Class是反射机制的根源,它代表了被加载进内存中的类。Class中提供了获取类属性、方法、构造方法等的一系列方法。

获取Class对象的方式

1.通过对象获取

例如,使用以下代码获取String类的Class对象:

String str = "hello world";
Class<? extends String> clazz = str.getClass();

2.通过类获取

例如,使用以下代码获取String类的Class对象:

Class<String> clazz = String.class;

3.通过Class.forName()方法获取

例如,使用以下代码获取String类的Class对象:

Class<?> clazz = Class.forName("java.lang.String");

获取类的属性

以下代码可以获取指定类的所有属性:

Field[] fields = clazz.getDeclaredFields();

获取类的方法

以下代码可以获取指定类的所有方法:

Method[] methods = clazz.getDeclaredMethods();

获取类的构造方法

以下代码可以获取指定类的所有构造方法:

Constructor<?>[] constructors = clazz.getDeclaredConstructors();

Constructor类

Constructor是反射机制中的一个类,它用于描述类的构造方法,Constructor对象用于创建新的类实例。

创建新的类实例

以下代码可以使用Constructor类的newInstance()方法创建一个新的类实例:

Constructor<?> constructor = clazz.getDeclaredConstructor();
Object instance = constructor.newInstance();

Method类

Method是反射机制中的一个类,它用于描述类的方法。

调用指定的方法

以下代码可以使用Method类的invoke()方法调用指定的方法:

Method method = clazz.getDeclaredMethod("methodName", paramTypes);
Object result = method.invoke(instance, args);

其中,methodName是方法名,paramTypes是方法参数类型数组,instance是该方法所在类的实例,args是参数数组。如果该方法是静态方法,则instance可以设为null。

示例

示例一

public class Person {
    private String name;
    private Integer age;
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public Integer getAge() {
        return age;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Person.class;
        Constructor<?> constructor = clazz.getDeclaredConstructor(String.class, Integer.class);
        Object person = constructor.newInstance("张三", 20);
        Method getName = clazz.getDeclaredMethod("getName");
        String name = (String)getName.invoke(person);
        System.out.println("姓名:" + name);
        Method getAge = clazz.getDeclaredMethod("getAge");
        Integer age = (Integer)getAge.invoke(person);
        System.out.println("年龄:" + age);
    }
}

运行结果:

姓名:张三
年龄:20

示例二

public class Math {
    public static int add(int a, int b) {
        return a + b;
    }
    public static int sub(int a, int b) {
        return a - b;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Math.class;
        Method add = clazz.getDeclaredMethod("add", int.class, int.class);
        int result1 = (int)add.invoke(null, 1, 2);
        System.out.println("1 + 2 = " + result1);
        Method sub = clazz.getDeclaredMethod("sub", int.class, int.class);
        int result2 = (int)sub.invoke(null, 5, 3);
        System.out.println("5 - 3 = " + result2);
    }
}

运行结果:

1 + 2 = 3
5 - 3 = 2
阅读剩余 69%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java反射机制基础详解 - Python技术站

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

相关文章

  • Sprint Boot @ComponentScan使用方法详解

    Spring Boot的@ComponentScan注解 在Spring Boot中,@ComponentScan注解用于自动扫描和注册bean。使用@ComponentScan注解可以将指定包及其子包中的所有组件自动注册到Spring应用程序上下文中。本文将详细介绍@ComponentScan注解的作用和使用方法,并提供两个示例说明。 @Component…

    Java 2023年5月5日
    00
  • 详解基于java的Socket聊天程序——服务端(附demo)

    详解基于java的Socket聊天程序——服务端(附demo)攻略 1. 简介 本文将详细介绍如何使用Java中的Socket编写一个简单的聊天程序。文章分为客户端和服务端两部分,本文将着重讲解服务端的实现过程,并提供对应示例代码。 2. 整体流程 创建ServerSocket 等待客户端连接,创建Socket 创建线程处理客户端连接 服务端处理客户端的消息…

    Java 2023年5月19日
    00
  • 使用java生成json时产生栈溢出错误问题及解决方案

    使用Java生成JSON时如果数据量较大、层次较深,容易出现栈溢出错误。本文将介绍栈溢出的原因及两种解决方案。 问题原因 生成JSON时,Java使用递归方式遍历数据结构,将其转换为JSON格式。如果数据量很大,层次较深,那么递归将产生很多层次的调用,导致栈空间不足,产生栈溢出错误。 解决方案1:调整栈空间大小 Java虚拟机中,栈大小默认为1MB,可通过设…

    Java 2023年5月20日
    00
  • 简单谈谈Java中String类型的参数传递问题

    关于Java中String类型的参数传递问题,我们从以下几个方面逐一展开讲解。 1. Java中的参数传递方式 Java中引用类型的参数传递是值传递的一种特殊形式。值传递是指将实际参数的值复制一份传递给函数,函数接收到的是实参值的一个副本,而不是实参值的引用。Java中对引用类型做值传递时其实是复制了一份引用,即一个指针类型的值传递到了方法中,引用的对象并没…

    Java 2023年5月27日
    00
  • java中List集合及其实现类的方法详解

    Java中List集合及其实现类的方法详解 什么是List集合? List集合是Java中最常用的集合之一,它可以存储有序、可重复的数据。 List实现类 Java中常见的List实现类有3种: ArrayList LinkedList Vector 其中,Vector常用于多线程并发访问的场景中,由于其性能较慢,因此本文不再赘述。下面详细讲解ArrayLi…

    Java 2023年5月18日
    00
  • Java实现字符串切割的方法详解

    Java实现字符串切割的方法详解 在Java开发中,经常需要将一个字符串按照特定规则进行切割,切割后的字符串可以使用来进行各种操作。本文就 Java 实现字符串切割的方法进行详细的讲解 1、使用 split() 方法 Java内置的String类中,提供了 split() 方法,该方法可以实现对字符串按照特定规则进行切割,返回一个字符串数组。下面是使用 sp…

    Java 2023年5月26日
    00
  • SpringBoot后端接口的实现(看这一篇就够了)

    “SpringBoot后端接口的实现(看这一篇就够了)”是一篇非常实用的文章,主要讲解了如何使用SpringBoot快速实现后端接口的开发。我将根据文章的内容为您提供一份完整攻略,帮助您理解和应用这篇文章。 1. 前置知识 在进行这个教程之前,您需要具备以下知识:- Java语言基础- SpringBoot框架基础- RESTful API的基本概念- Sp…

    Java 2023年5月15日
    00
  • Java注解详解及实现自定义注解的方法

    Java注解详解及实现自定义注解的方法 1. 什么是Java注解? Java注解是自JDK5版本之后引入的一项新特性,它可以通过在源代码中添加注解来为程序的元素(如类、方法、变量等)添加额外的信息,这些信息可以被编译器、IDE、框架等工具使用,以实现更加便捷、高效、灵活的开发方式。 一个Java注解的定义方式如下: public @interface MyA…

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