反射的理解及总结
转载链接:https://www.cnblogs.com/lzq198754/p/5780331.html
一、反射的定义
在运行状态下,能动态获取一个类的所有属性及方法,能动态调用任意一个对象的任意一个方法和属性。
二、反射机制的相关方法
1、通过一个对象获取对象的类名和报名:Object.getClass().getName()
2、动态加载类的三种方式:
(1)Class.forName(“com.java.Test”)
(2)new Test().getClass()
(3)Test.class;
3、获取一个对象的父类与实现的接口
(1)Class(?) TestClass = Class.forName(“com.java.Test”);//动态加载类
(2)TestClass.getSuperClass(); //获取一个对象的父类
(3)Class(?)[] intes = TestClass.getInterfaces(); //获取一个对象的所有接口
4、获取某一个类的全部构造函数
(1)Class(?) TestClass = Class.forName(“com.java.Test”);//动态加载类
(2)Test test = (Test)TestClass.newInstance(); //第一种方法,实例化默认构造方法
(3)Constructor<?>[] cons = TestClass.getConstructors(); //第二种方法,获取所有构造方法
(4)cons[0].getParameterTypes(); //查看构造方法的所有参数
(5)Test test = (Test)cons[0].newInstance(); //实例化无参构造方法
5、获取某个类的全部属性
(1)Class(?) TestClass = Class.forName(“com.java.Test”);//动态加载类
(2)Field[] fields = TestClass.getDeclaredFields(); //取得本类全部属性
(3)Field[] fields1 = TestClass.getFields(); //获取实现的接口或父类的属性
6、获取某个类的全部方法
(1)Class(?) TestClass = Class.forName(“com.java.Test”);//动态加载类
(2)Method[] methods = TestClass.getMethods(); //获取本类所有的方法
7、通过反射机制调用某个类的方法
(1)Class(?) TestClass = Class.forName(“com.java.Test”);//动态加载类
(2)Method method = TestClass.getMethod("test1", String.class) //获取指定方法,test1是方法名称,String.Class是参数类型
(3)method.invoke(TestClass.newInstance(), "test"); //方法的调用
8、通过反射机制操作某个类属性
(1)Class(?) TestClass = Class.forName(“com.java.Test”);//动态加载类
(2)Object obj = TestClass.newInstance(); //实例化对象
(3)Field field = TestClass.getDeclaredField("property"); //获取类的“property”字段
(4)field.setAcdessible(true); //设置可以访问private权限的字段
(5)field.set(obj, "zhangsan") //修改类的属性的值为“zhangsan”
9、动态代理
JDK实现动态代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整写法是:
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandle h);
ClassLoader loader:类加载器,例:new Test().getClass().getClassLoader();
Class<?>[] interfaces:目标对象的接口类型,例:new Test().getClass().getInterfaces();
InvocationHandle h:事件处理,执行目标对象的方法,会触发事件处理器的方法,会把当前执行目标对象的方法当作参数传入。
三、反射机制的应用
1、在泛型为Integer的ArrayList中存放一个String类型的对象
(1)List<Integer> list = new ArrayList<Integer>(); //新建一个泛型是Integer的list集合
(2)Method method = list.getMethod("add", Object.class); //获取ArrayLIst集合添加的方法
(3)method.invoke(list, "zhangsan"); //添加字符串“zhangsan”到泛型是Integer的list集合中
2、通过反射获取数组类型并修改数组信息
(1)int[] temp = {1, 2, 3, 4, 5}; //创建一个数组
(2)Class<?> demo = temp.getClass().getComponentType(); //获取数组类型
(3)demo.getName(); //获取数组类型名称
(4)Array.getLength(temp ); //获取数组长度,java反射机制使用的Array类,java.lang.class类在运行时获取数组的相关信息
(5)Array.get(temp, 0); //获取数组的第一个元素
(6)Array.set(temp, 0, 100); //设置数组的第一个元素是100
3、通过反射机制修改数组的大小
(1)int[] temp = {1, 2, 3, 4, 5}; //创建一个数组
(2)Class<?> arr= temp.getClass().getComponentType(); //获取数组类型
(3)Object newArr = Array.newInstance(arr, 15); //通过Array获取一个长度是15数组实例
(4)int co = Array.getLength(temp); //获取temp数组的长度
(5)System.arraycopy(temp, 0, newArr, 0, co); //复制新数组到通过反射创建的数组
4、反射机制在工厂模式中的使用
利用反射机制实现工厂模式,可以在不修改工厂类的情况下添加任意多个子类,但是需要知道包名和类名,这些可以放在配置文件中加载。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)