news 2026/6/30 23:29:17

反射使用详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
反射使用详解

一、反射(主要用于框架的开发)

反射:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)

1、反射第一步:加载类,获取类的字节码:Class对象

获取Class对象的三种方式

Class c1 = 类名.class

调用Class提供方法:public static Class forName(String package);

Object提供的方法:public Class getClass(); Class c3 = 对象.getClass();

public class Test { public static void main(String[] args) throws ClassNotFoundException { Class s1 = Student.class; System.out.println(s1.getName()); //全类名 System.out.println(s1.getSimpleName()); // 简名 Class s2 = Class.forName("com.itrus.study.reflect.Student"); System.out.println(s1 == s2); Student student = new Student(); Class s3 = student.getClass(); System.out.println(s1 == s3); } }

2.获取类的构造器

public class Student { private String name; private Student() { } public Student(String name) { this.name = name; } }

1.获取public修饰的所有构造器

public class Test2 { public static void main(String[] args) { Class s = Student.class; Constructor[] constructors = s.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor.getName() + "->" + constructor.getParameterCount()); } } }

2.获取所有构造器

public class Test2 { public static void main(String[] args) { Class s = Student.class; Constructor[] constructors = s.getDeclaredConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor.getName() + "->" + constructor.getParameterCount()); } } }

3.获取一个指定的public修饰的构造器

import java.lang.reflect.Constructor; public class Test2 { public static void main(String[] args) throws NoSuchMethodException { Class s = Student.class; Constructor constructor = s.getConstructor(String.class, int.class); System.out.println(constructor.getName() + "->" + constructor.getParameterCount()); } }

4.获取一个指定的任意构造器

public class Test2 { public static void main(String[] args) throws NoSuchMethodException { Class s = Student.class; Constructor constructor = s.getDeclaredConstructor(); System.out.println(constructor.getName() + "->" + constructor.getParameterCount()); } }

3.获取类构造器的作用

使用newInstance直接创建对象,可能会因为检查访问权限而导致创建失败,但是如果把accessible设置为true,即使是private修饰的私有构造方法也可以构造对象

public class Student { private String name; private int age; private Student() { System.out.println("初始化了一个对象"); } public Student(String name, int age) { this.name = name; this.age = age; } public Student(String name) { this.name = name; } }
public class Test2 { public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { Class s = Student.class; Constructor constructor = s.getDeclaredConstructor(); System.out.println(constructor.getName() + "->" + constructor.getParameterCount()); // cannot access a member of class com.itrus.study.reflect.Student with modifiers "private" //Student student = (Student) constructor.newInstance(); constructor.setAccessible(true); Student student = (Student) constructor.newInstance(); } }

4.获取类的成员变量

package com.itrus.study.reflect; public class Student { private static int a; public static final String str = "你好世界"; private String name; private int age; private Student() { System.out.println("初始化了一个对象"); } public Student(String name, int age) { this.name = name; this.age = age; } public Student(String name) { this.name = name; } }
public class Test3 { public static void main(String[] args) throws NoSuchFieldException { Class student = Student.class; //获取public修饰的所有属性 Field[] fields = student.getFields(); for(Field field : fields) { System.out.println(field.getName() + " ---> " + field.getType()); } System.out.println("================="); //获取所有属性 fields = student.getDeclaredFields(); for(Field field : fields) { System.out.println(field.getName() + " ---> " + field.getType()); } System.out.println("================="); //获取指定public成员变量 Field fstr = student.getField("str"); System.out.println(fstr.getName() + " ---> " + fstr.getType()); System.out.println("================="); //获取指定成员变量 Field fage = student.getDeclaredField("age"); System.out.println(fage.getName() + " ---> " + fage.getType()); System.out.println("================="); } }

5.获取类成员变量的作用

//给成员变量赋值 Student s = new Student(); fage.setAccessible(true); fage.set(s, 20); System.out.println(s); int age = (int) fage.get(s); System.out.println(age);

6.获取成员方法

getMethods会获取当前类和所有父类的public修饰的方法,而getDeclaredMethods方法是获取当前类的所有方法

package com.itrus.study.reflect; public class Student { private static int a; public static final String str = "你好世界"; private String name; private int age; public Student() { System.out.println("初始化了一个对象"); } private String eat() { return "吃饭"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Student(String name, int age) { this.name = name; this.age = age; } public Student(String name) { this.name = name; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
public class Test4 { public static void main(String[] args) throws NoSuchMethodException { Class c = Student.class; Method[] methods = c.getMethods(); for (Method method : methods) { System.out.println(method.getName() + " ---> " + method.getParameterCount() + " ---> " + method.getReturnType()); } System.out.println("======="); methods = c.getDeclaredMethods(); for (Method method : methods) { System.out.println(method.getName() + " ---> " + method.getParameterCount() + " ---> " + method.getReturnType()); } System.out.println("======="); Method method = c.getMethod("setName", String.class); System.out.println(method.getName() + " ---> " + method.getParameterCount() + " ---> " + method.getReturnType()); System.out.println("======="); method = c.getDeclaredMethod("setName", String.class); System.out.println(method.getName() + " ---> " + method.getParameterCount() + " ---> " + method.getReturnType()); System.out.println("======="); } }

7.获取成员方法的作用

Student s = new Student(); method.setAccessible(true); method.invoke(s, "张三"); System.out.println(s.getName());
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 23:27:31

阿里云盘Refresh Token获取:3分钟扫码授权完整指南

阿里云盘Refresh Token获取:3分钟扫码授权完整指南 【免费下载链接】aliyundriver-refresh-token QR Code扫码获取阿里云盘refresh token For Web 项目地址: https://gitcode.com/gh_mirrors/al/aliyundriver-refresh-token 你是否曾为阿里云盘API集成而烦恼…

作者头像 李华
网站建设 2026/6/30 23:26:22

敦煌壁画“活”了?AIGC绘画,正在批量生产“数字飞天”

“甘肃文创IP AIGC绘画,不是简单的技术叠加,而是文化价值与数字生产力的深度融合,选对策略才能让IP真正‘活’起来。”当前,文创行业正面临内容同质化严重、创作效率低下、文化表达难以精准触达用户等痛点。甘肃作为文化资源大省&…

作者头像 李华
网站建设 2026/6/30 23:25:04

数字孪生+机器人联动:C#上位机实现产线机器人虚拟仿真控制

核心摘要 在柔性制造与快速换型需求下,“先实物调试再上线”的传统模式已成为产线OEE的最大杀手。碰撞风险、节拍瓶颈与逻辑验证的滞后,导致现场调试周期动辄数周。本文提出一套基于C#/.NET 8的轻量级工业数字孪生架构:以Unity/Unreal为渲染前端,C#上位机为统一控制中枢,通…

作者头像 李华
网站建设 2026/6/30 23:21:40

移动端 App 测试入门(3)----Charles使用

1. 什么是Charles Charles(俗称青花瓷)是一款跨平台 HTTP/HTTPS 代理抓包调试工具,支持 Windows、macOS、Linux,是前端、移动端、测试工程师最常用的接口调试工具。 本质是本地代理服务器(默认监听 8888 端口&#xf…

作者头像 李华
网站建设 2026/6/30 23:20:25

深度解析FAE放射组学分析工具:医学影像数据挖掘的完全攻略

深度解析FAE放射组学分析工具:医学影像数据挖掘的完全攻略 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE 在医学影像研究领域,放射组学分析已成为连接影像特征与临床诊断的关键桥梁。FAE(…

作者头像 李华
网站建设 2026/6/30 23:13:21

第三篇:新大陆的轮廓:“数据不动,能力流动”的哲学与架构原则

控制面与数据面彻底分离,开启企业数字化的新范式 一、一个反直觉的断言 “未来最强大的企业,不是囤积最多数据的企业,而是‘能力’能触达最广数据的企业。” 这句话听起来反直觉。过去二十年,企业软件行业的核心信条是&#xf…

作者头像 李华