千家信息网

如何理解Java反射技术

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"如何理解Java反射技术"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前期概要1
千家信息网最后更新 2026年11月01日如何理解Java反射技术

本篇内容介绍了"如何理解Java反射技术"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、前期概要

1、 什么是反射

Java 反射机制在程序运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种 动态的获取信息 以及 动态调用对象的方法 的功能称为 java 的反射机制。反射中的反的理解:在使用的之前,提前不知道需要使用什么类型的对象。只是在调用的时候,才知道要调用的对象类型。这种反其道而行的就是反射中反的理解。程序执行分为编译器和运行期,编译时刻加载一个类就称为静态加载类,运行时刻加载类称为动态加载类,核心思想 让你在写代码的时候可以更加灵活,降低耦合,提高代码的自适应能力。反射框架提供如下常用的核心功能:1.在运行时判断任意对象所属的类;2.在运行时构造任意一个类的对象;3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);4.在运行时调用任意一个对象的方法;

2、反射的主要用途

通用框架,很多框架都是配置化的(比如Spring通过xml配置Bean), 为了保证框架的通用性,可能需要根据不同的配置文件加载不同的对象或者类,调用不同的方法,这个时候就需要反射,运行时动态加载需要加载的对象。

3、缺点

· 性能不佳 - 由于java反射动态解析类型,因此涉及扫描类路径以查找要加载的类的处理,从而导致性能降低。

· 安全限制 - Reflection需要运行时权限,这些权限可能不适用于在安全管理器下运行的系统。由于安全管理器,这可能导致应用程序在运行时失败。

· 安全问题 - 使用反射,我们可以访问我们不应该访问的部分代码,例如,我们可以访问类的私有字段并更改它的值。这可能是严重的安全威胁,并导致您的应用程序出现异常行为。

· 高维护 - 反射代码很难理解和调试,在编译时也无法找到代码的任何问题,因为这些类可能不可用,使其不太灵活且难以维护。

00001. Class 对象

00002. 类名

00003. 修饰符

00004. 包信息

00005. 父类

00006. 实现的接口

00007. 构造器

00008. 方法

00009. 变量

00010. 注解

二、获得 Class 对象

在运行期间,一个类,只有一个Class对象产生

1、类的静态方法(常用) :

00001. 说明获取指定的类完整的路径相关联类或接口的Class对象。

00002. 方法// 掌握public static Class forName(String className)// 了解public static Class forName(String className, boolean initialize,ClassLoader loader)

00003. 举个栗子Class clazz = Class.forName("http://com.wener.reflect.Xxx")// 或者 Class clazz = Class.forName("http://com.wener.reflect.Xxx",initialize,this.getClass().getClassLoader)

1. 说明任何数据类型(包括基本数据类型)都有一个"静态"的class属性

2. 方法Class cls = 类型.class;

3. 举个栗子Class cls = String.class;System.out.println(cls.toString());

1. 说明通过对象的实例来返回Class对象

2. 方法Class cls = instance.getClass()

3. 举个栗子public class User {}User user = new User();Class clz = user.getClass();

1. 方法// 通过字段名,返回一个具体的具有public属性的成员变量(包括父类的)Field getField(String name) // 通过字段名所有已声明的所有成员变量(私有的 默认的 共有的),但不能得到其父类的成员变量Field getDeclaredField(String name)

2. 举个栗子public class User {private String name;public String detail;}public static void main(String[] args) {try {Class cls = Class.forName("com.wener.reflect.demo1.User");/*** 获取类的指定名称公开的属性*/Field detail = cls.getField("detail");System.out.println(detail);/*** 获取类的指定名称的的属性(包括私有的属性)*/Field name = cls.getDeclaredField("name");System.out.println(name);} catch (ClassNotFoundException | NoSuchFieldException e) {e.printStackTrace();}}

1. 说明反射非常强大,但是学习了之后,会不知道该如何使用,反而觉得还不如直接调用方法来的直接和方便。但等我们后面接触到一些框架之后才会有一些感触

2. 测试类package com.wener.reflect.demo2; public class ReflectDemo1 { public void say() { System.out.println("ReflectDemo1"); } } public class ReflectDemo2 { public void say() { System.out.println("ReflectDemo2"); } }

3. 配置文件reflect.propertiesclass=ReflectDemo2. method=say

4. 测试代码public static void main(String[] args) { //从spring.txt中获取类名称和方法名称 File springConfigFile = new File("/Users/zhangwei/work/IdeaProjects/JavaExample/ReflectExample/src/reflect.properties"); Properties properties = new Properties(); try { properties.load(new FileInputStream(springConfigFile)); String className = (String) properties.get("class"); String methodName = (String) properties.get("method"); //根据类名称获取类对象 Class cls = Class.forName(className); //根据方法名称,获取方法对象 Method m = cls.getMethod(methodName); //根据构造器,实例化出对象 Object service = cls.newInstance(); //调用对象的指定方法 m.invoke(service); } catch (IOException | InvocationTargetException | NoSuchMethodException | IllegalAccessException | ClassNotFoundException | InstantiationException e) { e.printStackTrace(); } }

5. 优点当需要从调用第一个类的方法,切换到调用第二类的方法的时候,不需要修改一行代码

1、通过配置文件动态切换六、综合案例返回值 方法说明String getName()获取方法的名称int getModifiers()获取方法的修饰符Class getReturnType() Type getGenericReturnType返回方法的返回值类型Class[] getParameterTypes() Type[] getGenericParameterTypes()返回方法的参数(列表)Class[] getExceptionTypes() Type[] getGenericExceptionTypes()返回方法的异常信息4、其它API

1. 举个栗子public class User { private String name = "木木"; public String detail = "hello"; private int age; private BigDecimal balance; public void increment() { this.age++; System.out.println(age); } public BigDecimal getBalance() { return balance; } public void setBalance(BigDecimal balance) { this.balance = balance; } private void say(int num) { System.out.println(num + "号技师"); } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", detail='" + detail + '\'' + '}'; } } public class TestReflectUser { public static void main(String[] args) { reflectMethod(); } public static void reflectMethod() { try { // 1.实例化class对象 Class cls = Class.forName("com.wener.reflect.demo1.User"); // 2.实例化User对象 Object o = cls.newInstance(); // 3.获取set方法 Method method = cls.getMethod("increment"); // 4 执行方法 method.invoke(o); // 有参数无返回值 Method setBalance = cls.getMethod("setBalance", BigDecimal.class); Object methodSet = setBalance.invoke(o, new BigDecimal(100.00)); System.out.println(methodSet); // 有返回值值无参数 Method methodGet = cls.getMethod("getBalance"); Object invoke = methodGet.invoke(o); System.out.println(invoke); // 获取私有的方法 Method say = cls.getDeclaredMethod("say", int.class); // 运行时取消访问权限检测机制 say.setAccessible(true); // 执行方法 say.invoke(o, 1); } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } } }

使用参数 args 在 obj 上指派该对象所表示方法的结果

1. 方法Object invoke(Object obj, Object... args)

2. 参数说明

· obj - 从中调用底层方法的对象,必须是实例化的对象

· args - 用于方法调用的参数,是个Object数组,因为参数有可能有多个

1. 返回值

3、调用方法

1. 方法// 返回类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 public Method[] getDeclaredMethods() throws SecurityException// 返回某个类的所有公用(public)方法,包括其继承类的公用方法。 public Method[] getMethods() throws SecurityException

2. 举个栗子public class TestReflectUser { public static void main(String[] args) { reflectMethod(); } public static void reflectMethod() { try { // 1.实例化class对象 Class cls = Class.forName("com.wener.reflect.demo1.User"); // 2.实例化User对象 Object o = cls.newInstance(); // 获取所有的共有的方法(包括父类的方法) Method[] methods = cls.getMethods(); for (Method method1 : methods) { System.out.println(method1.getName()); } // 获取所有的方法(包括私有的,共有的,默认的) Method[] declaredMethods = cls.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { System.out.println(declaredMethod.getName()); } } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } } }

2、获取所有的方法

1. 方法// 方法返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象 public Method getMethod(String name, Class... parameterTypes)

2. 举个栗子public class User { private String name = "木木"; public String detail = "hello"; private int age; private BigDecimal balance; public void increment() { this.age++; System.out.println(age); } public BigDecimal getBalance() { return balance; } public void setBalance(BigDecimal balance) { this.balance = balance; } private void say(int num) { System.out.println(num + "号技师"); } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", detail='" + detail + '\'' + '}'; } } public class TestReflectUser { public static void main(String[] args) { reflectMethod(); } public static void reflectMethod() { try { // 1.实例化class对象 Class cls = Class.forName("com.wener.reflect.demo1.User"); // 2.实例化User对象 Object o = cls.newInstance(); // 3.获取increment方法 Method method = cls.getMethod("increment"); // 有参数无返回值 Method setBalance = cls.getMethod("setBalance", BigDecimal.class); // 有返回值值无参数 Method methodGet = cls.getMethod("getBalance"); // 获取私有的方法 Method say = cls.getDeclaredMethod("say", int.class); } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } } }

1、获取单个方法五、方法操作

1. 方法// 将指定对象参数上的此Field对象表示的字段设置为指定的新值 field.set(Object obj,Object value)

2. 参数说明

· Object obj: 字段所在的类的实例对象

· Object value : 新值

1. 注意// 如果要给私有变量赋值必须取消权限的访问控制 field.setAccessible(true);

2. 举个栗子public static void main(String[] args) { try { // 1 实例化Class对象 Class cls = Class.forName("com.wener.reflect.demo1.User"); /** * 获取类的指定名称公有的属性 */ Field detail = cls.getField("detail"); System.out.println(detail); /** * 获取类的所有的属性(包括私有 默认的 公有的) */ Field name = cls.getDeclaredField("name"); // 2.创建对象 Object o = cls.newInstance(); // 3 通过字段的set方法设置 name.set(o, "娇娇"); System.out.println(o.toString()); } catch (ClassNotFoundException | NoSuchFieldException | InstantiationException | IllegalAccessException e) { e.printStackTrace(); } }

4、字段赋值

1. 方法// 获取所有的"公有字段" Field[] getFields() // 获取所有字段(私有、受保护、默认、公有) Field[] getDeclaredFields()

2. 举个栗子public class TestReflectUserField { public static void main(String[] args) { try { Class cls = Class.forName("com.wener.reflect.demo1.User"); Field[] fields = cls.getFields(); for (Field field : fields) { System.out.println("类型: " + field.getType() + "方法名: " + field.getName()); } Field[] declaredFields = cls.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println("类型: " + declaredField.getType() + "方法名: " + declaredField.getName()); } } catch (ClassNotFoundException | NoSuchFieldException | InstantiationException | IllegalAccessException e) { e.printStackTrace(); } } }

3、获取所有成员字段

2、获取单个成员字段类的成员变量也是一个对象,它是java.lang.reflect.Field的一个对象,所以我们通过java.lang.reflect.Field里面封装的方法来获取这些信息并且操作这些属性1、说明四、属性操作

1. cls.newInstance()方法返回的是一个泛型T,我们要强转成自定义类

2. cls.newInstance()默认返回的是类的无参数构造对象

3. 被反射机制加载的类必须有无参数构造方法,否者运行会抛出异常

1.4、注意三、创建实例

1. 常用的是类的静态方法,

2. getClass()的话一般在继承的时候用的比较多一点,比如Android里的注解框架

3. .class 静态语法: 需要导入类的包,依赖太强,不导包就抛编译错误

"如何理解Java反射技术"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

方法 对象 反射 参数 实例 运行 字段 属性 私有 类型 栗子 代码 变量 名称 成员 动态 框架 安全 时候 静态 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技有限公司 互联网佳科技有限公司 重生之互联网科技帝国 中国互联网科技股 互联网科技资迅 互联网金融公司科技 安徽鑫晟辉互联网科技 深圳天众互联网科技公司 盛创互联网科技有限公司 宁波青枫互联网科技有限公司 汽车互联网创新科技园 浙南科技城互联网大厦建设工程 华夏恒生科技与互联网科技 互联网金融科技名词解释 工业互联网山东科技大学 每天都有哪些好的互联网科技 启辰互联网科技 产业互联网科技服务公司 九思连强互联网电子科技有限公司 珠海东科互联网科技有限公司 鸠鸠互联网科技 没上市的科技互联网公司 广州凡科互联网科技 互联网数据科技专业 宇信科技在杭州互联网排第几 卡尔迅互联网科技有限公司 互联网与数字科技关系 萌小萌互联网科技河南有限公司 互联网科技手抄报图片 安徽九吞吴互联网科技有限公司
0