首页 > 编程语言 >Java Reflection机制 实现类的反射与动态调用

Java Reflection机制 实现类的反射与动态调用

时间:2023-08-07 17:57:00浏览次数:46  
标签:调用 Java Reflection age Class public name

Java Reflection机制 实现类的反射与动态调用

Java Reflection机制被广泛用于实现类的反射和动态调用,反射是指在运行时检查和操作类的能力。只需要一个类的名称或对象的引用,就可以获取类的信息,调用类的方法,创建对象实例等。

JavaReflection机制 实现类的反射与动态调用

Java Reflection机制包括以下几个核心类:

- Class类:表示一个Java类的类对象,可以获取类的名称、父类、接口、字段、方法等信息。

- Field类:表示一个Java类的属性,可以获取和设置该属性的值。

- Method类:表示一个Java类的方法,可以调用该方法并获取返回值。

- Constructor类:表示一个Java类的构造方法,可以创建该类的对象实例。

反射机制提供了一种动态调用Java类的方法的方式。它可以在运行时创建、检查和调用类的方法,这种方式非常灵活和方便,但也存在性能问题。因为反射需要在运行时动态获取类信息,所以会产生额外的开销,影响程序性能。

下面通过一个简单的示例来说明Java Reflection机制的基本用法。

首先定义一个Person类:

public class Person {

private String name;

private int age;

public Person(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public int getAge() {

return age;

}

public void setName(String name) {

this.name = name;

}

public void setAge(int age) {

this.age = age;

}

public void sayHello() {

System.out.println(\Hello, my name is \ + name + \ I'm \ + age + \ years old.\ }

}

然后在主函数中动态创建Person对象,获取其属性和方法,进行调用:

public static void main(String[] args) throws Exception {

Class clazz = Class.forName(\Person\

Constructor constructor = clazz.getConstructor(String.class, int.class);

Object obj = constructor.newInstance(\Tom\ 20);

Field ageField = clazz.getDeclaredField(\age\ ageField.setAccessible(true);

int age = (int) ageField.get(obj);

System.out.println(\Age: \ + age);

Method setNameMethod = clazz.getDeclaredMethod(\setName\ String.class);

setNameMethod.invoke(obj, \Jerry\

Method sayHelloMethod = clazz.getDeclaredMethod(\sayHello\ sayHelloMethod.invoke(obj);

}

代码首先通过Class.forName()方法获取Person类的Class对象,然后通过Class.getConstructor()方法获取构造函数,再通过构造函数的newInstance()方法创建对象实例。接着通过Class.getDeclaredField()方法获取age属性的Field对象,并设置其可访问性为true,然后通过Field.get()方法获取age属性的值。接下来通过Class.getDeclaredMethod()方法获取setName()和sayHello()方法的Method对象,并分别通过Method.invoke()方法调用这两个方法。

通过上述示例代码可以看出,在Java Reflection机制的帮助下,我们可以在运行时动态地获取类的信息和调用类的方法,这种方式非常灵活和方便。但是,由于反射需要在运行时动态获取类信息,所以会产生额外的开销,影响程序性能。因此,在实际开发中,需要权衡反射的灵活性和性能开销,并根据具体情况进行选择。
本文部分代码转自:https://www.wodianping.com/java/2023-08/252023.html

标签:调用,Java,Reflection,age,Class,public,name
From: https://www.cnblogs.com/wodianpingcom/p/17612069.html

相关文章

  • idea2022.3.1 java文件显示J
     解决办法:1、File>projectstructure>Modules 把Java标成sources,相应资源文件标成resource。2、刷新一下maven,重启一下IDEA就可以了 ......
  • java获取类的属性名
    publicstaticvoidmain(String[]args){try{Classclazz=Class.forName("net.chinaedu.bigc.center.domain.teacher.req.TeacherInfoReq");//根据类名获得其对应的Class对象写上你想要的类名就是了注意是全名如果有包的话要加上比如java.Lang.String......
  • 【狂神说Java】Java零基础学习笔记-Java数组
    【狂神说Java】Java零基础学习笔记-Java数组Java数组01:数组的定义数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们.Java数组02:数组声明创建......
  • JAVA ASE 默认随机 sha1 key加密
    使用原始的方法publicstaticStringEncryptEncode(Stringcontent,String...key)throwsException{StringencryptKey="audaque2018";KeyGeneratorkeyGenerator=KeyGenerator.getInstance("AES");SecureRandomrandom=......
  • 关于Java的IO流开发
    IO概述回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了。那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据读出来继续使用呢?其实要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他......
  • java @Value重配置文件中获取不同的值
    在Java中,使用`@Value`注解可以从配置文件中获取不同的值。`@Value`注解可以用于类的字段或方法的参数上。首先,确保在Spring应用程序中正确配置了配置文件。通常,配置文件的名称为`application.properties`或`application.yaml`,并位于类路径下。接下来,您可以在需要获取配置值的类或方......
  • 调用Geoserver发布的图层中文字段显示乱码
    通过OL使用WFS服务,调用发布的图层字段,中文字段显示为乱码  有几种原因:①指定打印的字符格式在代码中指定输出的编码格式,例如使用console.log('@@xxx',xzq.toString('utf-8'))来指定输出为UTF-8编码格式。②添加meta如果是在网页中输出乱码,可以在HTML的<head>标......
  • Java后端05(初识MyBatis)
    Mybatis举个小栗子mybatis配置文件(XML配置文件)<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><!--通过这个配置文......
  • Java后端06(代理模式)
    代理模式​ spring中就使用了代理模式,Java中的代理模式分为一下两种静态代理:最简单,但是每次修改都需要重新编译动态代理:分为两种(jdk动态代理--通过接口实现来进行代理&cglib动态代理--通过子类继承来实现代理)静态代理​ 静态代理致命问题:代理对象必须提前编译好,所有代......
  • 深入探索JavaScript的魅力与奇妙之处
    大家好!今天我想分享一些关于JavaScript(简称JS)的思考和体会。作为前端开发中最重要的语言之一,JS不仅具备强大的功能,还有着许多令人着迷的特性。首先,JavaScript的灵活性是其最引人注目的特点之一。它允许我们以多种方式解决问题,无论是面向对象编程、函数式编程还是响应式编程,JS都能......