反射——Java高级开发必备知识

2024-09-04 21:32

本文主要是介绍反射——Java高级开发必备知识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.什么是反射

这里写图片描述
我们知道,通过类可以创建对象,那么创建好的对象可不可以再获取类的信息呢,就好比父亲创造了儿子,那么能否通过儿子得到父亲的信息并利用父亲的信息呢,在Java中是可以的。
由此可知反射所具有的功能是利用类的对象来调用类的方法、属性等信息。

2.Class类

自然界中万物皆对象。
类也是对象,是Class类的实例对象,这个对象我们称为该类的类型。
Class类是一切反射的根源。
。。。。。。。。。。。。。引用某大师的话

那么得到Class类的对象(也就是一般类)有几种方式呢??
第一:通过Object类中的getClass()方法——实例对象.getClass();
第二:类名.class;
第三:通过Class类的forName()方法——Class.forName(“类的全称”);

3.动态加载类

所谓动态加载就是在运行时只加载需要用到的类,不关心无关类的内容,在软件的功能完善方面效果明显。

package 动态加载类;
class Example{public static void main(String[] args)  {try {/** 动态加载类,在运行时刻加载* forName()返回args[0]的类类型*/Class<?> c=Class.forName("动态加载类.Word"); //通过类类型创建对象OfficeAble oa=(OfficeAble)c.newInstance();oa.start();} catch (Exception e) {e.printStackTrace();}}
}
interface OfficeAble{public void start();
}
class Word implements OfficeAble{public void start(){System.out.println("word--starts--");}class PPT{ B b=new B(); }}

输出结果
我们注意到程序的最后一行,class PPT{ B b=new B(); }很明显,B这个类我们并没有定义,但为什么还是运行出结果了呢(没有报错),是因为程序在运行的时候并没有将类全部加载,只是在运行过程中将用到的Word类进行加载。

4.通过反射获取的类的信息(以String类为例)

(1)获取成员方法的信息


package 反射;
import java.lang.reflect.Method;class ClassUtil {static void printClassMessage(Object obj) {//要获取类的信息,首先要获取类的类型Class c=obj.getClass();//传递的是哪个子类的对象 c就是该子类的类类型//获取类的名称System.out.println("类的名称是:"+c.getName());/** Method类,方法对象(万事万物皆对象)* 一个成员方法就是一个Method对象* getMethods()方法获取的是所有的public函数,包括从父类继承的* getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限*/Method[] ms=c.getMethods();for(int i=0;i<ms.length;i++){//得到方法的返回值类型Class returnType=ms[i].getReturnType();System.out.print(returnType.getName()+" ");//得到方法的名称System.out.print(ms[i].getName()+"(");//获取参数类型---->得到参数列表的类型的类类型Class[] paramTypes=ms[i].getParameterTypes();for(Class class1:paramTypes){System.out.print(class1.getName()+",");}System.out.println(")");}}
}
public class Example1 {public static void main(String[] args) {String s="hello";ClassUtil.printClassMessage(s);
}
}

String类的成员方法输出
(2)获取成员变量的信息

package 反射;
import java.lang.reflect.Field;class ClassUtil {static void printClassMessage(Object obj) {//要获取类的信息,首先要获取类的类型Class c=obj.getClass();//传递的是哪个子类的对象 c就是该子类的类类型//获取类的名称System.out.println("类的名称是:"+c.getName());/** 成员变量也是对象* java.lang.reflect.Field* Field类封装了关于成员变量的操作* getFields()方法获取的是所有的public的成员变量的信息* getDeclaredFields()获取的是该类自己声明的成员变量的信息 */Field[] fs=c.getDeclaredFields();for (Field field : fs) {//得到成员变量的类型的类类型Class fieldType=field.getType();String typeName=fieldType.getName();//得到成员变量的名称String fieldName=field.getName();System.out.println("成员变量是:"+typeName+" "+fieldName); }}
}
public class Example1 {public static void main(String[] args) {String s="hello";ClassUtil.printClassMessage(s);
}
}

这里写图片描述

(3)获取构造函数信息

package 反射;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;class ClassUtil {static void printClassMessage(Object obj) {//要获取类的信息,首先要获取类的类型Class c=obj.getClass();//传递的是哪个子类的对象 c就是该子类的类类型//获取类的名称System.out.println("类的名称是:"+c.getName());/** 构造函数也是对象* java.lang.Constructor中封装了构造函数的信息* getConstructors()获取所有的public的构造函数* getDeclaredConstructors()得到所有的构造函数* */Constructor[] cs=c.getDeclaredConstructors();for (Constructor constructor : cs) {System.out.print("构造方法:"+constructor.getName()+"(");//获取构造函数的参数列表--->得到的是参数列表的类类型Class[] paramTypes=constructor.getParameterTypes();for (Class class1 : paramTypes) {System.out.print(class1.getName()+",");}System.out.println(")");}}
}
public class Example {public static void main(String[] args) {String s="hello";ClassUtil.printClassMessage(s);
}
}

构造方法信息输出

5.阶段总结

这里写图片描述
Class是Reflection API中的核心类,其常用方法有:
这里写图片描述

这篇关于反射——Java高级开发必备知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取