Reflection反射
=================================================================================
【概念】:
1、Java反射的概念
反射含义:可以获取正在运行的Java对象。
2、Java反射的功能
1)可以判断运行时对象所属的类
2)可以判断运行时对象所具有的成员变量和方法
3)通过反射甚至可以调用到private的方法
4)生成动态代理
=======================================================================================
【有什么用】:
举一个简单的例子:
我们在eclipse新建一个类及其方法属性时,下面调用对象方法以及属性时,直接一个点,就会给我们列出它所有的类和方法,这就是利用了java的反射机制。对一个类的自审,
现在我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类的已经被加载了。
【一个准女婿要见未婚妻家人的故事引出】:
譬如 A a=new A();
a.put(2);
这个是在编译阶段完成对a类型的解析,对a是不是有put方法进行了判断,如果a对象没有put方法,则编译不通过。
可是有的时候我们需要在运行的时候动态地对一个对象的指定方法进行调用,我不想写的那么死,在编译的时候就写就好像小明想和小红家庭中的哪个人聊天都没有确定我怎么能直接把小明和小红爸爸绑在一起呢,让程序在运行时候更有主动性,更能变通和迎接外来挑战。这时候我想写一个通用函数,传入一个对象,可以是小红爸爸,小红妈妈,可以是小红,把这个对象属性名,属性值,都输出反映给小明知道,小明才知道怎么更好的跟小红家庭成员交谈,在了解了他们兴趣爱好之后。
反射含义:可以获取正在运行的Java对象。
=======================================================================================
【JDK支持】:
JDK1.5以后引入,JDK1.4以及以前版本不支持。
=======================================================================================
【怎么用】:
实现Java反射的类
1)Class:它表示正在运行的Java应用程序中的类和接口
2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限
3)Constructor:提供关于类的单个构造方法的信息以及对它的访问权限
4)Method:提供关于类或接口中某个方法信息
【重点】:其中Class类很重要。官方解释一大串,然而看后并不懂什么鬼,对程序员最好的语言就是代码
转:疯狂java
public static void test01() throws ClassNotFoundException { Class c1 = TestReflection.class; Class c2 = Class.forName("com.reflection.TestReflection"); //获取指定的包名 String package01 = c1.getPackage().getName(); String package02 = c2.getPackage().getName(); System.out.println("package01 = " + package01); System.out.println("package02 = " + package02); //获取类的修饰符 int mod = c1.getModifiers(); String modifier = Modifier.toString(mod); System.out.println("modifier = " + modifier); //获取指定类的完全限定名 String className = c1.getName(); System.out.println("className = " + className); //获取指定类的父类 Class superClazz = c1.getSuperclass(); String superClazzName = superClazz.getName(); System.out.println("superClazzName = " + superClazzName); //获取实现的接口 Class[] interfaces = c1.getInterfaces(); for (Class t : interfaces) { System.out.println("interfacesName = " + t.getName()); } //获取指定类的成员变量 Field[] fields = c1.getDeclaredFields(); for (Field field : fields) { modifier = Modifier.toString(field.getModifiers()); //获取每个 字段的访问修饰符 Class type = field.getType(); //获取字段的数据类型所对应的 Class对象 String name = field.getName(); //获取字段名 if (type.isArray()) { //如果是数组类型则需要特别处理 String arrType = type.getComponentType().getName() + "[]"; System.out.println("" + modifier + " " + arrType + " " + name + ";"); } else { System.out.println("" + modifier + " " + type + " " + name + ";"); } } //获取类的构造方法 Constructor[] constructors = c1.getDeclaredConstructors(); for (Constructor constructor : constructors) { String name = constructor.getName(); //构造方法名 modifier = Modifier.toString(constructor.getModifiers()); //获取访问修饰符 System.out.println("" + modifier +" " + name + "("); Class[] paramTypes = constructor.getParameterTypes(); //获取构造方法中的参数 for (int i = 0; i < paramTypes.length; i++) { if (i > 0) { System.out.print(","); } if (paramTypes[i].isArray()) { System.out.println(paramTypes [i].getComponentType().getName()+"[]"); } else { System.out.print(paramTypes[i].getName()); } } System.out.println(");"); } //获取成员方法 Method[] methods = c1.getDeclaredMethods(); for (Method method: methods) { modifier = Modifier.toString(method.getModifiers()); Class returnType = method.getReturnType(); //获取方法的返回类型 if (returnType.isArray()) { String arrType = returnType.getComponentType ().getName()+"[]"; System.out.print(""+modifier+" " + arrType + " " + method.getName() + "("); } else { System.out.print("" + modifier + " " + returnType.getName() + " " + method.getName() + "("); } Class[] paramTypes = method.getParameterTypes(); for (int i = 0; i < paramTypes.length; i++) { if (i > 0) { System.out.print(","); } if (paramTypes[i].isArray()) { System.out.println(paramTypes [i].getComponentType().getName()+"[]"); } else { System.out.print(paramTypes[i].getName()); } } System.out.println(");"); }
https://www.douban.com/note/306848299/
这个网址各种用法写的非常详细,大家可以去看一下。基本涵盖反射机制在代码中的方法实例
相关推荐
静态校准与动态校准的区别.docx 传感器校准与标定:传感器的静态校准_14.校准标准与规范.docx 传感器校准与标定:传感器的静态校准_15.案例研究与实践操作.docx 传感器校准与标定:传感器的静态校准_2.静态校准的...
3. **反射**:反射是在运行时检查类、接口、字段和方法等的能力,通常用于实现动态代理或需要动态加载类的场景。 #### 三、核心知识点 接下来,我们将通过一个具体的例子来演示如何使用Java反射获取内部类的静态...
在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段以及方法等...这些文件都是Java开发中的常见元素,与反射调用静态方法的主题直接关联性不大,但它们构成了一个完整的Java项目环境。
A星与DWA融合的智能路径规划算法:实现静态与动态障碍物避让的代码详解及Matlab源码,A星融合DWA算法:静态与动态避障功能详解,附详细注释Matlab源码,A星融合DWA的路径规划算法,可实现静态避障碍及动态避障,代码...
质子交换膜燃料电池(PEMFC)Simulink模型:静态与动态模拟,性能参数解析与响应能力展示,附带公式、文献与使用说明,质子交换膜燃料电池(PEMFC)Simulink模型详解:静态与动态特性分析及其参数计算参考公式与文献...
质子交换膜燃料电池的仿真探究:静态与动态模型的输出分析及应用指南,质子交换膜燃料电池(PEMFC)Simulink模型:静态与动态模拟解析及性能参数研究参考公式使用指南,质子交膜燃料电池(PEMFC Simulink模型) ...
融合DWA与改进蚁群算法:静态与动态路径规划技术及其在栅格地图上的应用研究,融合DWA与改进蚁群算法的混合路径规划系统:栅格地图动态静态路径规划优化策略,改进蚁群算法融合DWA算法,能够静态加动态路径规划。...
二阶多智能体系统领导跟随行为的动态静态一致性研究,二阶多智能体领导跟随动态静态一致性。 ,二阶多智能体; 领导跟随; 动态一致性; 静态一致性;,二阶多智能体领导跟随:动态静态一致性研究
PEMFC的Simulink模型构建:探究静态与动态性能,计算输出、效率及关键参数参考公式与文献解析,PEMFC的Simulink模型:探究静态与动态性能,计算输出、效率及关键参数参考公式文献详解,质子交膜燃料电池(PEMFC) ...
1. **动态与静态页面的区别** - 动态页面:基于服务器端脚本(如ASP.NET、PHP等),根据用户请求实时生成内容,每次请求都会执行数据库查询和其他逻辑处理。 - 静态页面:预先生成并存储为HTML文件,直接由Web...
质子交换膜燃料电池的仿真探究:静态与动态模型的输出分析及应用指南,质子交膜燃料电池(PEMFC Simulink模型) (1)仿真内容:包括燃料电池静态模型、燃料电池动态模型 ①静态模型:可以得到燃料电池的极化曲线,并...
基于A星算法与DWA融合的动态路径规划技术:实现静态与动态避障的智能导航,基于A星算法与DWA融合的动态路径规划技术:实现静态与动态避障的智能导航,基于A星与DWA算法融合的动态路径规划,可实现静态避障碍及动态避障...
质子交换膜燃料电池(PEMFC)Simulink模型详解:静态与动态特性分析,附带参考公式与文献说明,质子交膜燃料电池(PEMFC Simulink模型) (1)仿真内容:包括燃料电池静态模型、燃料电池动态模型 ①静态模型:可以...
### Linux静态库与动态库详解 #### 一、引言 在Linux环境下,库是一种重要的软件组件,用于封装一组相关的函数或数据结构,以便于在不同的应用程序之间共享代码。库通常分为两大类:静态库(static libraries)和...
基于Dwa方法的局部路径规划详解:包含静态与动态障碍物的详细注解代码,Dwa方法实现局部路径规划:含静态与动态障碍物的详细注解代码,Dwa方法实现局部路径规划,代码有注解,包含静态障碍物和动态障碍物 ,Dwa方法;...
使用反射处理内部类时,需要注意区分匿名内部类、静态内部类和非静态内部类。反射API允许我们获取内部类的Class对象,创建内部类实例,并访问或调用其成员。 2. 类的反射: 反射的核心是Class类,它代表了Java类的...
静态代理需要为每个目标类创建一个代理类,而动态代理则可以在运行时动态创建代理对象,减少了代码量,同时适应性更强,能够处理未知或新增的接口。 6. **代理模式的其他实现**:除了Java的动态代理,还有其他实现...
使用简单的程序展示了C++调用动态库和静态库的方法。 文件结构: exe:笔者部署可运行文件,因开发环境版本不同,可能存在无法直接使用的情况,两个部署文件(copy_ldd.sh及useLib1.sh)可以结合文章分享的(ubuntu下...
在动态生成静态页面的场景下,可能包含与静态化相关的设置或路由规则。 `binRuntimeError.log`可能是运行时错误日志,它记录了程序执行过程中遇到的问题,有助于调试和优化静态化过程。 `hhftohtml.sln`和`...