15、java反射
java反射
什么是反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制
获取反射的三种方法
-
通过Class.forName(包名.类名);
比如: Class cls = Class.forName ("day02.com.instance.Dog");
-
通过 类名.class();
比如: Class cls = Dog.class () ;
-
通过对象的getClass();
比如: Dog dog = new Dog();
Class cls = dog.getClass ();
//获取反射的三种方式 //1.直接通过包名类名获取 Class cls = Class.forName("day02.com.instance.Dog"); //2.通过类名获取 cls = Dog.class; //3.通过对象获取 Dog wangcai = new Dog("旺财",10); cls = wangcai.getClass();
通过反射获取属性:
-
通过cls 调用 getDeclaredFields() 得到field[],获取到所有的属性,包括私有的。
-
返回一个类名。
**getSimpleName**()
//获取反射中的对象的所有属性 /** Field [] fs = cls.getDeclaredFields(); for (Field field : fs) { //获取属性的名字 System.out.println(field.getName()); //获取属性的类型 System.out.println(field.getType().getName()); //获取属性的值(要通过对象获取特定对象的某个属性值) //要看访问修饰符,不然会报异常 System.out.println(field.get(wangcai)); //给属性赋值 if("name".equals(field.getName())) { field.set(wangcai, "大黄"); } } System.out.println(wangcai);*/
通过反射获取方法:
//获取到反射中所有的方法(不包含构造方法) Method[] me = cls.getDeclaredMethods(); for (Method method : me) { //获取方法的mingc //System.out.println(method.getName()); //获取所有方法的返回值类型 //System.out.println(method.getReturnType().getName()); //以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符 //System.out.println(method.getModifiers()); // 按照声明顺序返回 Class 对象的数组, //这些对象描述了此 Method 对象所表示的方法的形参类型 //System.out.println(method.getParameterTypes()); //利用方法来调用对象的方法 if("getName".equals(method.getName())) { System.out.println(method.invoke(wangcai)); } }
通过反射创建对象:
//利用反射来创建对象 Object obj = cls.newInstance();
通过反射获取所有的构造方法:
cls.getDeclaredConstructors() 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法
ResultSetMetaData
通过ResultSet.getMetaData()获取,可以得到数据库中的列的个数,列名,列的类型。
ResultSetMetaData rsmd = ResultSet.getMetaData();
- 获取指定列的个数: rsmd.getColumnCount(int index );
- 获取指定列名: rsmd.getColumnName(int index);
- 获取指定列的类型: rsmd.getColumnType(int index);
有什么用呢?
可以通过指定的列名跟实体类的成员变量是相同的情况下,我们就可以直接给实体类赋值了。
代码分层
为什么要代码分层呢?
在大型的项目中,代码量很多,如果都放在一个包中,在检查bug的时候就不利于我们改bug,也不利于我们进行维护。所有我们将代码分类,分成三层架构,控制层(controller),业务逻辑层(Service),数据层(dao),以及我们的实体类(po),还可以有更的包将他们分类,比如说专门提供工具的类的包util等。
我们在写的时候也许增加我们的代码量,但在我们维护的过程中,就可以通过层次来排查,大大的提高了我们维护的效率。
三层架构
在业务逻辑层和数据层,我们定义一个接口,然后用接口对象引用一个实现类的对象,比如:
接口 接口的引用 实现类
UserDao userDao = new UserDaoImpl();
这样降低代码的耦合,当我们的业务逻辑改变的时候,我们只需要改变实现类就行,其他的代码就不能改,这就是接口编程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!