反射

反射的引入

  • 编译时知道类或者对象的具体信息,此时直接对类和对象操作即可,无需反射(reflection)
  • 如果编译不知道类或对象的具体信息,此时如何做? 使用反射来实现。比如类的名称放在XML文件中,属性和属性值放在XML文件中,需要在运行时读取XML文件。动态获取类的信息。

反射的应用场合

  • 在编译时根本无法知道该对象或类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息

  • 类如:log4j、Servlet、ssm

反射的作用

  • 动态创建对象
  • 动态调用方法
  • 动态操作属性
  • 动态操作泛型和注解

反射机制的实现

  • Class类:代表一个类
  • Constructor类:代表路的构造方法
  • Field类:代表类的成员属性
  • Method类:代表类的成员方法(实例方法和类方法)

Class类的使用

获得Class类的对象

        //获取class类对象的三种方式//方式一:通过  类名.class获取Class<String> clazz = String.class;Class<Student> clazz2 = Student.class;System.out.println(clazz);System.out.println(clazz2);//方式二:通过Class的静态方法forName获取Class<String> clazz3 = (Class<String>) Class.forName("java.lang.String");Class<Student> clazz4 = (Class<Student>) Class.forName("com.day04.Student");System.out.println(clazz3);System.out.println(clazz4);//方式三: 通过某个类的对象获得该类的Class类的对象String str = "111111";Class<String> clazz5 = (Class<String>) str.getClass();Student stu = new Student();Class<Student> clazz6 = (Class<Student>) stu.getClass();System.out.println(clazz5);System.out.println(clazz6);

获得clazz对象表示的class文件中的构造方法

     try {//创建Student类的Class对象Class<Student> clazz = Student.class;       //获得无参构造方法Constructor<Student> constructor = clazz.getDeclaredConstructor(null);//通过无参构造方法获得Student对象Student student = constructor.newInstance(null);System.out.println(student);//获得带参的构造方法Constructor<Student> constructor2 = clazz.getDeclaredConstructor(Integer.class,String.class,char.class,Integer.class,String.class);//通过带参构造方法获得Student对象Student student2 = constructor2.newInstance(123,"张三",'男',23,"北京");System.out.println(student2);}catch(Exception e) {e.printStackTrace();}

获得clazz对象中clazz文件中的实例方法

     try {//获得Student类的Class对象Class<Student> clazz = Student.class;//创建对象//获得无参构造方法 来获得对象Student student = clazz.getDeclaredConstructor(null).newInstance(null);//获得指定方法名的方法Method setName = clazz.getDeclaredMethod("setName", String.class);//调用Student类中的setName方法setName.invoke(student, "007");//获得指定方法名的方法Method getName = clazz.getDeclaredMethod("getName", null);//调用方法,获取到值Object object = getName.invoke(student, null);System.out.println(object);}catch(Exception e) {e.printStackTrace();}

获得clazz对象中clazz文件中的属性

     try {//创建Student类的Class对象Class<Student> clazz = Student.class;//通过获得无参构造方法创建对象Student student = clazz.getDeclaredConstructor(null).newInstance(null);//获得指定名字属性Field name = clazz.getDeclaredField("name");//获得属性名String name2 = name.getName();System.out.println(name2);//获得属性类型Class<?> type = name.getType();System.out.println(type);//获得属性访问权限int modifiers = name.getModifiers();System.out.println(modifiers);//修改属性访问权限,默认为falsename.setAccessible(true);//给属性赋值name.set(student, "林中鸟");//获得属性值Object object = name.get(student);System.out.println(object);}catch(Exception e) {e.printStackTrace();}

三个类中的方法比较

加Declared 不加Declared
Constructor 所有的构造方法 公共的构造方法
Method 所有本类的方法 所有的公共方法,包括继承的
Field 所有本类的属性 所有的公共成员属性,包括继承的

ResultSetMateData类

对象封装了查询结果集的虚拟表的结构,可以知道表中列数,表中的数据,表中的列对应的数据库中的类型,表中对应的java中的类型

        //1. 通过结果集获取虚拟表对象ResultSetMetaData rsmd = rs.getMetaData();//2.获得虚拟表的列数int count = rsmd.getColumnCount();System.out.println("虚拟表中的列的个数为:" + count);for(int x = 1; x <= count;x ++) {//3.获得某一列的值Object value = rs.getObject(x);//4.获得虚拟表中列的名字String columnName = rsmd.getColumnName(x);System.out.println("虚拟表中列的名字:" + columnName);//5.获得虚拟表中列的对应数据库中的数据类型int type = rsmd.getColumnType(x);String columnTypeName = rsmd.getColumnTypeName(x);System.out.println(x + "\t" + columnTypeName);//6.获得虚拟表中列的类型对应的java类型String columnClassName = rsmd.getColumnClassName(x);System.out.println("对应的java类型:" + columnClassName);}

java中的反射技术相关推荐

  1. 深入理解Java中的反射技术

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

  2. java中的反射机制是什么

    给大家介绍一下java中的反射机制,java中反射机制更体现出了java的灵活性.多态.和类之间的耦合性. 1:反射是一种间接操作目标对象的机制,只要给定类的名字,就可以通过反设机制获取所有的类信息. ...

  3. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  4. Java 中使用反射来创建对象、调用方法

    Java 中使用反射来创建对象.调用方法 反射创建对象 反射调用方法 反射调用私有方法 反射调用可变参私有方法 反射调用的方法自身可以抛出异常的情形   假设已有下面的类: import java.l ...

  5. java代码安全检测机制_全面解析:java中的反射机制,内含代码验证解析

    什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功 ...

  6. formdata 接受参数中带有class 对象_浅析JAVA中的反射机制及对Servlet的优化

    今天来聊聊java中的反射机制,工作以后发现很多东西动不动就要使用反射或者动态代理,如果不能很好的理解反射,那么对于动态代理等一些重要的设计模式就会有种不够通透的感觉. 所谓的反射,就是在运行状态中, ...

  7. java中ajax是什么意思,java中使用Ajax技术

    ajax技术是使页面能局部刷新的一种技术,全称应该是asynchronous JavaScript and xml从几个单词就知道它的请求响应的处理是异步的,而且使用的是JavaScript和xml技 ...

  8. Java中的反射和枚举

    假设现在上面的数据是以二次探测的方式来进行存放的,现在让你求: 现在找1:直接就能找到----->次数是1 现在找4:直接就可以找到---->次数是1 现在找14:先得到4的下标,发现不是 ...

  9. Java中的反射机制详讲

    Java中的反射机制详讲 1.反射机制_介绍_Class对象获取 2.反射机制_动态操作_构造器_方法_属性 3.动态编译_DanamicCompile_反射调用main方法问题 好文推荐:排序.查找 ...

  10. Java中的反射如何理解——精简

    目录 引言 反射概念 反射获取类对象 反射获取构造器对象 获取构造器对象并使用 反射获取成员变量对象 反射获取方法对象 反射获取成员方法并使用 引言 经过前面的学习,相信大家已经能够对网络编程有了一定 ...

最新文章

  1. 从数据库中存取二进制数据并显示
  2. 重庆工商大学c语言实验一答案,重庆工商大学嵌入式实验考试题目答案 - 副本.doc...
  3. java 滚动加载,滚动加载,可视区域判断
  4. Shell 脚本编程之基础
  5. oracle客户端和ssh区别,oracle 使用SSH 转发功能
  6. 试述hadoop生态系统以及每个部分的具体功能_Hadoop在大数据分析中的意义和作用...
  7. mvc html.dropdownlist,ASP.NET MVC4中使用Html.DropDownListFor的方法示例
  8. 第四章 ASP.NET MVC HTML.ActionLink输出超链接的具体用法
  9. 分区表的误区:性能提升
  10. 少儿C++编程如何入门
  11. ResourceBundle 中文乱码
  12. python导出pdf_python生成pdf
  13. 简单多人聊天室——java网络编程
  14. Emacs 配置 latex
  15. FPGA Verilog语言常用语法
  16. 利用Html与css从零开始制作基础静态网页(web课设)
  17. Golang:加密解密算法
  18. linux中常见中英文单词对照表
  19. CADENCE 拼板经验
  20. hardware 中的几个地址问题

热门文章

  1. 《高效能人士的七个习惯》阅读笔记
  2. 3DMark03 测试显卡
  3. 基于PHP+Html+MySQL的网上手机商城系统
  4. 实验一-波士顿房价预测
  5. mysql怎么做纵表,本文实例讲述了MySQL横纵表相互转化操作实现方法。分享给大家供大家参考,具体如下:先创建一个成绩表(纵表)create table user_scor...
  6. docker ctrl p 失灵
  7. Pytorch中的forward的理解
  8. 【编译原理】语义分析S属性定义的自下而上计算
  9. HTML CSS JS 网页设计作业「我的家乡」汉口5页 带留言表单
  10. c语言第十章函数课后作业,c语言函数练习题附答案.doc