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

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

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

相关文章

  • AngularJS使用ng-inlude指令加载页面失败的原因与解决方法

    AngularJS 是一个开源的MVVM(Model-View-ViewModel)前端框架,能够通过数据双向绑定和依赖注入等技术,提高Web开发效率,降低Web开发难度。其中ng-include指令是AngularJS中的一个重要指令,它可以将一个外部文档(HTML或JS)嵌入到AngularJS应用中的一个DOM元素中。但有时候在使用ng-include…

    Java 2023年6月15日
    00
  • Spring Security自定义登录页面认证过程常用配置

    下面我就为您详细讲解“Spring Security自定义登录页面认证过程常用配置”的攻略。 先决条件 在开始自定义登录页面的配置之前,您需要了解以下先决条件: 您已经学会了Spring Security的基本用法; 您已经熟悉了Spring Boot和Thymeleaf。 配置步骤 接下来,我将为您介绍几个常用的自定义登录页面的配置步骤: 第1步:创建登录…

    Java 2023年6月3日
    00
  • 使用Java接入小程序订阅消息!

    更新完微信服务号的模板消息之后,我又赶紧把微信小程序的订阅消息给实现了!之前我一直以为微信小程序也是要企业才能申请,没想到小程序个人就能申请。 消息推送平台?推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等消息类型。 https://gitee.com/zhongfucheng/austin/ https://github.com/…

    Java 2023年4月19日
    00
  • struts2通过action返回json对象

    实现Struts2通过Action返回JSON对象,可以按照以下步骤进行操作: 步骤一:导入依赖 在项目的pom.xml中导入struts2-json-plugin依赖,以便能够支持JSON格式的数据: <dependency> <groupId>org.apache.struts</groupId> <artifa…

    Java 2023年5月20日
    00
  • Java 使用Calendar计算时间的示例代码

    下面是关于Java使用Calendar计算时间的完整攻略。 简介 Java提供了大量的时间和日期处理类和方法,其中Calendar类是处理时间和日期计算非常常用的类之一。这个类被广泛地应用于Java应用程序中,特别是在必须处理复杂日期和时间计算情况下。 获取Calendar实例 在使用Calendar类前,需要先获取一个Calendar实例。通常情况下,可以…

    Java 2023年5月20日
    00
  • SpringMVC 使用JSR-303进行校验 @Valid示例

    下面是 SpringMVC 使用 JSR-303 进行校验的完整攻略: 1. 添加依赖 在 pom.xml 添加如下依赖: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId&…

    Java 2023年6月15日
    00
  • Struts2实现多文件上传功能

    第一步:引入依赖在项目的 pom.xml 文件中添加以下依赖: <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1&lt…

    Java 2023年5月20日
    00
  • js实现跨域的方法实例详解

    JS实现跨域的方法实例详解 跨域问题指的是由于浏览器的同源策略(Same-Origin Policy)限制,使得在浏览器中请求数据时只能获取与当前页面属于同一个域名、端口和协议的数据,而不能获取其他域名、端口或协议的数据。该问题可以通过以下多种方式来解决。 1. JSONP(JSON with Padding) JSONP是一种跨域通信的方案之一,利用scr…

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