当前位置: 首页 > news >正文

反射使用详解

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

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

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());
http://www.jsqmd.com/news/1099018/

相关文章:

  • 管人这件事:三流领导靠罚,二流靠制度,一流靠方法
  • Dify实战教程:从零搭建企业级AI应用,掌握低代码开发与工作流设计
  • Paperxie 课程论文智能写作:填空式创作,轻松搞定期末结课论文
  • AI 创业融资策略:从技术壁垒到资本叙事的结构化拆解
  • SPI机制:服务扩展的核心技术
  • HarmonyOS Floating TabBar:悬浮底部导航栏实战(HdsTabs + MiniBar + 模糊材质全指南)
  • 用WSL(Windows Subsystem for Linux :适用于Linux的windows子系统) 在 Windows 系统上运行你最喜爱的linux工具、使用工具,应用工具和工作流
  • openeuler/skills用户指南:从安装到优化的10个实用技巧
  • 时钟控制器和TIM、DMA、ADC、UART控制器
  • 如何为PPT添加编辑限制密码?图文详解设置与移除方法
  • 从大鼠到山羊,从肌腱细胞到肌腱干细胞——云克隆原代肌腱细胞全系列,为肌腱研究提供了一套完整的“细胞工具”
  • 2026年6月全球零代码网站制作工具盘点测评!不会编程也能做
  • 上下文工程 vs 提示词工程:决定 Agent 上限的,是前者不是你天天调的那玩意
  • 2026年企业如何选择、落地智能呼叫中心?功能拆解+部署指南
  • 手机AI Agent系统级集成实战:从架构到代码的完整指南
  • 别再凭感觉选RC了!用这个比率设计法,5分钟搞定Sallen-Key低通滤波器
  • C#工业相机软件的自动升级与远程维护系统实现
  • 阿里云盘Refresh Token获取:3分钟扫码授权完整指南
  • Unsloth量化实战:消费级显卡(12GB)跑通8B大模型
  • 从“能签”到“智签”,从工具到中枢,行业正在经历深层重构
  • 工业防爆监控选型技术指南:云南高危工矿场景适配方案与厂商技术能力分析
  • 如何快速上手JPEXS免费Flash反编译器:完整的新手入门指南
  • JDspyder京东抢购脚本:3步实现秒杀自动化的终极指南
  • AI自动编程真的可靠吗,我只是随便问问
  • 如何随时随地玩PC游戏:Sunshine游戏串流服务器完全指南
  • 2026年AI入坑完整学习路线:别再死磕Prompt了,Harness与Loop工程才是下一波变现红利
  • 如何用零代码文本分析工具KH Coder挖掘海量文本价值:面向新手的完整指南
  • 算法(二叉树递归)
  • Linux运维实战:从零搭建Zabbix监控Docker容器与MySQL
  • 连锁门店SD-WAN组网选型部署全攻略:50店年省60万的实操路径