15、java反射

java反射

什么是反射?

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

获取反射的三种方法

  1. 通过Class.forName(包名.类名);

    ​ 比如: Class cls = Class.forName ("day02.com.instance.Dog");

  2. 通过 类名.class();

    ​ 比如: Class cls = Dog.class () ;

  3. 通过对象的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();

通过反射获取属性:

  1. 通过cls 调用 getDeclaredFields() 得到field[],获取到所有的属性,包括私有的。

  2. 返回一个类名

    **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();

  1. 获取指定列的个数: rsmd.getColumnCount(int index );
  2. 获取指定列名: rsmd.getColumnName(int index);
  3. 获取指定列的类型: rsmd.getColumnType(int index);

有什么用呢?

可以通过指定的列名跟实体类的成员变量是相同的情况下,我们就可以直接给实体类赋值了。

代码分层

为什么要代码分层呢?

在大型的项目中,代码量很多,如果都放在一个包中,在检查bug的时候就不利于我们改bug,也不利于我们进行维护。所有我们将代码分类,分成三层架构控制层(controller),业务逻辑层(Service),数据层(dao),以及我们的实体类(po),还可以有更的包将他们分类,比如说专门提供工具的类的包util等。

我们在写的时候也许增加我们的代码量,但在我们维护的过程中,就可以通过层次来排查,大大的提高了我们维护的效率。

三层架构

在业务逻辑层和数据层,我们定义一个接口,然后用接口对象引用一个实现类的对象,比如:

接口 接口的引用 实现类

UserDao userDao = new UserDaoImpl();

这样降低代码的耦合,当我们的业务逻辑改变的时候,我们只需要改变实现类就行,其他的代码就不能改,这就是接口编程。

posted @   站着说话不腰疼  阅读(42)  评论(0编辑  收藏  举报
编辑推荐:
· 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 重磅开源!
点击右上角即可分享
微信分享提示