java 反射机制:简单来讲,通过反射,类对我们是完全透明的,想要获取任何东西都可以。

2024-01-06 02:32

本文主要是介绍java 反射机制:简单来讲,通过反射,类对我们是完全透明的,想要获取任何东西都可以。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是反射机制

在程序运行状态中,对于任意一个类或对象,都能够获取到这个类的所有属性和方法(包括私有属性和方法),这种动态获取信息以及动态调用对象方法的功能就称为反射机制。
简单来讲,通过反射,类对我们是完全透明的,想要获取任何东西都可以。

反射机制的优点

  • 可以在程序运行过程中,操作这些对象;
  • 可以解耦,提高程序的可扩展性。

什么是反编译

反编译就是把*.class 文件逆向生成*.java文件。

今天我们就使用反射机制来实现反编译的功能。

首先:准备.class文件

package com.wenqidao.bean;public class Worker implements Person {//成员变量public String name;public int age;private String address;//构造方法public Worker() {}public Worker(String name, int age, String address) {this.name = name;this.age = age;this.address = address;}//成员方法public void eat() {System.out.println("eat...");}private void play() {System.out.println("play...");}//get、set方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

public interface Person {
}

然后:开始通过反射,反编译 .class 文件

package com.wenqidao.test;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;public class DecompilationDemo {public static void main(String[] args) throws Exception {//获取Person的Class对象Class clazz = Class.forName("com.wenqidao.bean.Worker");System.out.println("=========获取包相关==========");//获取类的包名Package packageName = clazz.getPackage();System.out.println(packageName);System.out.println("=========获取类相关==========");//获取类的权限修饰符//public:1 private:2int modifiers = clazz.getModifiers();//把int类型的权限修饰符转换为String类型String modifier = Modifier.toString(modifiers);System.out.print(modifier);//获取类名String className = clazz.getSimpleName();System.out.print(" class " + className);//获取类继承的父类String parentClassName = clazz.getSuperclass().getSimpleName();System.out.print(" extends " + parentClassName);//获取类实现的接口System.out.print(" implements ");Class[] interfaces = clazz.getInterfaces();for (int i = 0; i < interfaces.length; i++) {System.out.print(interfaces[i].getSimpleName());if (i < interfaces.length - 1) {System.out.print(" , ");}}System.out.println(" { ");System.out.println("=========获取成员变量==========");//获取所有的成员变量Field[] fields = clazz.getDeclaredFields();for (int i = 0; i < fields.length; i++) {//获取成员变量的修饰符String fieldModifier = Modifier.toString(fields[i].getModifiers());System.out.print("\t" + fieldModifier + " ");//获取成员变量的类型String fieldName = fields[i].getType().getSimpleName();System.out.print(fieldName + " ");//获取成员变量的变量名String name = fields[i].getName();System.out.println(name + " ;");}System.out.println("=========获取构造器==========");//获取构造器Constructor[] constructors = clazz.getDeclaredConstructors();for (int i = 0; i < constructors.length; i++) {//获取构造器的权限修饰符String constructorModifier = Modifier.toString(constructors[i].getModifiers());System.out.print("\t" + constructorModifier + " ");//在Constructor中无法直接获取构造器的限定名,但是构造器的限定名和类名一样,所以可以直接使用类名System.out.print(className + "(");//获取构造器的所有参数Class[] prams = constructors[i].getParameterTypes();for (int j = 0; j < prams.length; j++) {String pramName = prams[j].getSimpleName();System.out.print(pramName + " args" + j);if (j < prams.length - 1) {System.out.print(" , ");}}System.out.print(")");System.out.println("{}");}System.out.println("=========获取成员方法==========");// 获取所有成员方法Method[] methods = clazz.getDeclaredMethods();for (int i = 0; i < methods.length; i++) {//获取方法的权限修饰符String methodModifier = Modifier.toString(methods[i].getModifiers());System.out.print("\t" + methodModifier + " ");//获取方法的限定名String methodSimpleName = methods[i].getReturnType().getSimpleName();System.out.print(methodSimpleName + " ");//获取自定义的的方法名String methodName = methods[i].getName();System.out.print(methodName);System.out.print("(");//获取所有参数Class[] prams = methods[i].getParameterTypes();for (int j = 0; j < prams.length; j++) {String pramName = prams[j].getSimpleName();System.out.print(pramName + " args" + j);if (j < prams.length - 1) {System.out.print(" , ");}}System.out.print(")");System.out.println("{}");}}
}

运行结果:

这篇关于java 反射机制:简单来讲,通过反射,类对我们是完全透明的,想要获取任何东西都可以。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/574954

相关文章

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连