仿站容易还是建站容易三站合一网站建设

张小明 2026/1/8 20:11:42
仿站容易还是建站容易,三站合一网站建设,dplayer wordpress,龙岩网址大全一、先搞懂#xff1a;反射到底是个什么东西#xff1f;反射就是程序在运行的时候#xff0c;能够动态获取类的所有信息#xff08;比如成员变量、方法、构造器#xff09;#xff0c;并且还能直接操作这些信息的一种机制。举个通俗的例子#xff1a;平时我们写Java代码…一、先搞懂反射到底是个什么东西反射就是程序在运行的时候能够动态获取类的所有信息比如成员变量、方法、构造器并且还能直接操作这些信息的一种机制。举个通俗的例子平时我们写Java代码都是先知道要用到哪个类然后new一个对象再调用它的方法——就像你知道要找小明借东西直接走到他面前说“把东西借我用用”。而反射不一样它是你不知道具体找哪个人但能通过某种“侦查手段”找到这个人还能强行用他的东西——这就是“动态”的意思运行时才确定要操作的类和对象。二、为什么要学反射刚开始我也疑惑好好的直接调用方法不香吗为啥非要搞反射这么复杂的东西总结下来有3个核心作用实现动态创建对象和调用方法这是最核心的作用。比如我们写一个通用的工具类需要适配不同的类这时候就不能把类名写死而是通过反射动态获取类信息、创建对象。突破类的封装性操作私有成员平时我们写的private成员变量、private方法外部是没法直接访问的但反射可以。比如有时候我们需要修改一个类的私有变量又不想改这个类的源码比如用别人写的jar包这时候反射就派上用场了。实现通用编程提高代码复用性比如写一个通用的对象拷贝工具、通用的数据库操作工具不需要针对每个类单独写代码而是通过反射获取类的成员变量动态赋值和读取大大减少重复代码。这里要提醒一句反射虽然强大但也不能随便用因为它打破了封装性会让代码的安全性降低而且运行效率比直接调用要低一点平时开发中如果能直接调用就别用反射三、新手入门反射的核心API实操附代码示例理论讲再多不如写一遍代码反射的核心操作其实就围绕3个步骤获取Class对象 → 通过Class对象获取类的内部信息成员变量、方法、构造器 → 操作这些内部信息创建对象、调用方法、修改变量。下面用一个简单的Student类来演示第一步先定义一个测试用的Student类public class Student { // 成员变量包含public和private public String name; private int age; // 构造器无参和有参 public Student() { } public Student(String name, int age) { this.name name; this.age age; } // 成员方法包含public和private public void study() { System.out.println(name 正在学习Java反射); } private void eat(String food) { System.out.println(name 正在吃 food); } Override public String toString() { return Student{name name , age age }; } }第二步核心操作1获取Class对象要使用反射第一步必须获取目标类的Class对象这是反射的入口public class ReflectionDemo { public static void main(String[] args) throws ClassNotFoundException { // 方式1通过类名.class获取最常用编译时就确定 Class? clazz1 Student.class; // 方式2通过对象.getClass()获取需要先创建对象适合已经有实例的情况 Student student new Student(); Class? clazz2 student.getClass(); // 方式3通过Class.forName(全类名)获取动态加载最灵活运行时确定 // 注意全类名是包名类名比如我的Student类在com.test包下 Class? clazz3 Class.forName(com.test.Student); // 验证一下这三个Class对象是同一个一个类只有一个Class对象 System.out.println(clazz1 clazz2); // true System.out.println(clazz1 clazz3); // true } }这里要注意Class.forName()方法需要处理ClassNotFoundException异常要么throws要么try-catch第三步核心操作2通过Class对象操作类的内部信息获取到Class对象后就可以通过它的API获取成员变量、方法、构造器然后进行操作了。下面分场景演示几个常用的操作场景1通过反射创建对象两种方式public class ReflectionDemo { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Class? clazz Class.forName(com.test.Student); // 方式1通过无参构造器创建对象需要类有public的无参构造器 Object student1 clazz.newInstance(); System.out.println(student1); // 输出Student{namenull, age0} // 方式2通过有参构造器创建对象 // 1. 先获取有参构造器参数是构造器的参数类型.class Constructor? constructor clazz.getConstructor(String.class, int.class); // 2. 调用构造器的newInstance()方法创建对象传入实际参数 Object student2 constructor.newInstance(小明, 20); System.out.println(student2); // 输出Student{name小明, age20} } }场景2通过反射获取和修改成员变量包括privatepublic class ReflectionDemo { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException { Class? clazz Class.forName(com.test.Student); Object student clazz.newInstance(); // 1. 获取public成员变量name并修改 Field nameField clazz.getField(name); nameField.set(student, 小红); // 给student对象的name属性赋值 System.out.println(nameField.get(student)); // 获取name属性的值输出小红 // 2. 获取private成员变量age并修改需要先设置setAccessible(true)打破封装 Field ageField clazz.getDeclaredField(age); ageField.setAccessible(true); // 关键允许访问private成员 ageField.set(student, 19); // 给private的age属性赋值 System.out.println(ageField.get(student)); // 获取age属性的值输出19 } }这里重点说一下getField()只能获取public的成员变量要获取private的必须用getDeclaredField()并且要调用setAccessible(true)来关闭Java的访问检查这样才能操作private成员。场景3通过反射调用成员方法包括privatepublic class ReflectionDemo { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Class? clazz Class.forName(com.test.Student); Object student clazz.newInstance(); // 1. 先给name属性赋值方便方法输出 Field nameField clazz.getField(name); nameField.set(student, 小李); // 2. 调用public方法study() Method studyMethod clazz.getMethod(study); studyMethod.invoke(student); // 调用方法输出小李正在学习Java反射 // 3. 调用private方法eat(String food) Method eatMethod clazz.getDeclaredMethod(eat, String.class); // 第二个参数是方法的参数类型.class eatMethod.setAccessible(true); // 允许访问private方法 eatMethod.invoke(student, 汉堡); // 调用方法传入参数输出小李正在吃汉堡 } }这里要注意getMethod()获取public方法getDeclaredMethod()获取所有方法包括private调用方法时用invoke()第一个参数是要调用方法的对象后面的参数是方法的实际参数。四、需要注意的点忘记处理异常反射的大部分API都会抛出checked异常比如ClassNotFoundException、NoSuchMethodException新手容易忘写try-catch或者throws导致编译报错。用getField()获取private变量getField()只能获取public的获取private的必须用getDeclaredField()还要加setAccessible(true)。获取有参构造器时参数类型写错比如构造器是Student(String name, int age)获取时写成getConstructor(String.class, String.class)就会报NoSuchMethodException。调用invoke()时忘记传对象非静态方法必须传入要调用的对象静态方法可以传null。认为反射能修改final变量虽然反射能获取final变量但修改它的结果是不确定的不同JVM可能有不同表现尽量不要这么做。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站制作都包括什么网站建设网站需要什么软件

comsol声辐射力捕获粒子最近在研究用Comsol模拟声辐射力捕获粒子,感觉还挺有意思的,来跟大家分享一下。声辐射力是一种利用声场与粒子相互作用产生的力,可用于操控和捕获微小粒子。在Comsol中,我们可以通过一系列步骤来实现对这一…

张小明 2026/1/4 15:44:27 网站建设

网站备案管局电话国家家企业信用信息系统

OpenPNM孔隙网络建模:从微观结构到宏观性能的完整技术解析 【免费下载链接】OpenPNM A Python package for performing pore network modeling of porous media 项目地址: https://gitcode.com/gh_mirrors/op/OpenPNM 在能源材料、环境工程和生物医学等领域&…

张小明 2026/1/6 21:37:33 网站建设

购物网站开发uml图wordpress友情链接提交

基于单片机的一氧化碳报警装置设计 第一章 绪论 一氧化碳作为无色无味、毒性极强的气体,广泛产生于煤炭燃烧、燃气泄漏等场景,其泄漏引发的中毒事故严重威胁人身安全。传统一氧化碳检测方式多依赖人工排查,存在响应滞后、检测范围有限等缺陷&…

张小明 2026/1/7 18:38:16 网站建设

海口网站建设公司哪个好dede游戏网站模板

深入理解Ollydbg中的寄存器与堆栈:恶意代码分析的“显微镜”你有没有试过面对一段加密、混淆、甚至自修改的恶意程序,反汇编窗口里满屏都是跳转和垃圾指令,根本看不出它到底想干什么?静态分析走到尽头时,真正能帮你“看…

张小明 2026/1/6 3:42:30 网站建设

临沂经开区建设局网站有一个外国网站专门做街头搭讪

AutoGPT镜像合作伙伴招募:共建AI自动化生态 在人工智能从“能说”走向“会做”的关键转折点,一种新型的自主智能体正悄然改变人机协作的边界。传统聊天机器人依赖用户一步步发号施令,而如今,只需一句“帮我写一份新能源行业的投资…

张小明 2026/1/8 16:51:21 网站建设

南昌自助建站wordpress表单美化

ESP32语音翻译设备终极指南:从零构建你的智能翻译助手 【免费下载链接】xiaozhi-esp32 小智 AI 聊天机器人是个开源项目,能语音唤醒、多语言识别、支持多种大模型,可显示对话内容等,帮助人们入门 AI 硬件开发。源项目地址&#xf…

张小明 2026/1/8 15:36:02 网站建设