阿哲学了就来聊——Java反射

  • 概念
    • Class类
      • 获得类的相关方法
      • 获得类中属性相关的方法
      • 获得类中构造器的相关方法
    • Field
    • Method类
    • Constructor类
  • 作用
    • 构造方法
    • 普通方法
    • 属性
  • 反射案例
    • 实现DBUtils工具类
    • 测试代码
      • 查询emps数据表
      • 查询dept数据表
  • [git 源码](https://github.com/OldAZ/case_1/tree/master/1.case_Java%E5%8F%8D%E5%B0%84)

概念

reflect 反射 ,反转 权力的转让
类中有很多的方法和属性,方法的调用权限,属性的赋值权限,属于对象的。
让对象把这些权力交出来,交给Class和其它反射类(Field,Method,Contructor)管理。

Class类 的范围就是天下所有的字节码文件,每一个类被编译成字节码文件后,都可以看成是Class类的对象

  • 与Java反射相关的类如下:
类名 用途
Class类 代表类的实体,在运行的Java程序中表示类和接口
Field类 代表成员变量(成员变量也成为属性)
Mehod 代表类的方法
Construtor类 代表类的构造方法

Class类

Class类代表实体,在运行Java应用程序中表示类和接口。这个类中提供了很多有用的方法,这里对他们的分类进行简单介绍。

获得类的相关方法

方法 用途
asSubclass(Class class) 把传递的类和对象转换成代表其子类的对象
Cast 把对象转换成代表类或是接口对象
getClassLoader() 获得类的加载器
getClasses() 返回一个数组,该数组中含该类中有所有的公共类和接口类的对象
getDeclaredClasses 返回一个数组,该数组中包含该类所有的类和接口对象
forName(String className) 根据类返回类的对象
getName() 获得类的完整路径名字
newInstance() 创建类的实例
getPackage() 获得类的包
getSimpleName() 获得类的名字
getSuperclass() 获得当前类继承的父类的名字
getInterfaces() 获得当前实现的类或者是接口

获得类中属性相关的方法

方法 用途
getFiled(String name) 获得某个共有的属性对象
getDFileds() 获得所有的共有属性对象
getDeclaredFiled ( String name ) 获得某个属性对象
getDeclaredFileds ( String name ) 获得所有属性对象

获得类中构造器的相关方法

方法 用途
getMethod(String name, Class…<?> parameterTypes) 获得该类某个公有的方法
getMethods() 获得该类所有公有的方法
getDeclaredMethod(String name, Class…<?> parameterTypes) 获得该类某个方法
getDeclaredMethods() 获得该类所有方法

Field

Field代表类的成员变量(成员变量也称为类的属性)。

方法 用途
equals(Object obj) 属性与obj相等则返回true
get(Object obj) 获得obj中对应的属性值
set(Object obj, Object value) 设置obj中对应属性值

Method类

Method代表类的方法。

方法 用途
invoke(Object obj, Object… args) 传递object对象及参数调用该对象对应的方法

Constructor类

Constructor代表类的构造方法。

方法 用途
newInstance(Object… initargs) 根据传递的参数创建类的对象

作用

  • 获取Class对象
@Test
public void test1(){// 1.获取某个类的实体类对象:三种方式Class<Emps> c1 = Emps.class;Class<?extends Emps> c2 = new Emps().getClass();try {Class<?> c3 = Class.forName("com.web.pojo.Emps");} catch (ClassNotFoundException e) {e.printStackTrace();}//2.分别对实体类的成员(属性,方法,构造方法)进行托管
}

构造方法

@Test//使用构造器管理实体类中的构造方法public void test2() throws Exception {// 1.获取class对象对象:三种方式Class<Emps> c1 = Emps.class;//2.获取构造方法的管理类//2.1托管无参构造Emps emps =  c1.newInstance();//2.2托管有参构造Constructor<Emps> Constructor = c1.getDeclaredConstructor(Integer.class, String.class);Emps emps1 = Constructor.newInstance(1, "元歌");System.out.println(emps);System.out.println(emps1);}

普通方法

@Test//使用Method类,来管理实体类中的某个方法
public void test4() throws Exception {// 1.获取class对象对象Class<Emps> c1 = Emps.class;//2.获取某个方法的管理类MethodMethod method = c1.getDeclaredMethod("setName", String.class);Emps emps = c1.newInstance();System.out.println(emps);method.invoke(emps,"韩信");System.out.println(emps);System.out.println("--------调用toString------");Method method1 = c1.getDeclaredMethod("toString");Object invoke = method1.invoke(emps);System.out.println(invoke);}

属性

@Test//使用field类,来管理实体类中的某个属性
public void test3() throws Exception {// 1.获取class对象对象:三种方式Class<Emps> c1 = Emps.class;//2.获取某个属性的管理类FieldField f1 = c1.getDeclaredField("name");Field f2 = c1.getDeclaredField("age");Emps emps = c1.newInstance();//3.开启私有属性的操作权限f1.setAccessible(true);f2.setAccessible(true);System.out.println(emps);f1.set(emps,"孙尚香");f2.set(emps,18);System.out.println(emps);
}

反射案例

实现DBUtils工具类

封装查询结果集的原理
实用多个数据表格的通用查询
package com.web.jdbc;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.*;public class JdbcUtil {//封装结果集的通用方法public static <T> List<T> rsToList(String sql,Class<T> c){ArrayList<T> list = new ArrayList<>();//加载驱动,获取连接对象try {//加载驱动,获取连接对象Class.forName("com.mysql.jdbc.Driver");Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/wuhanhb?useSSL=false", "root", "root");//获取执行sql对象,执行sql,返回结果集rsPreparedStatement psmt = con.prepareStatement(sql);ResultSet rs = psmt.executeQuery(sql);//3.遍历rs//3.1借助元数据,获取列名和总列数ResultSetMetaData md = rs.getMetaData();int conut = md.getColumnCount();while (rs.next()){//循环一次获取一行数据,调用一次Object获取一个单元格的数据T t = c.newInstance();for (int i=1;i<=conut;i++) {Object value = rs.getObject(i);//每一列的列名充当T中的属性名,获取对应的属性管理对象fField f = c.getDeclaredField(md.getColumnName(i));f.setAccessible(true);//为私有属性赋值f.set(t,value);}list.add(t);}return list;} catch (Exception e) {e.printStackTrace();return null;}}
}

测试代码

查询emps数据表

  • 这是数据库中的数据
  • 这是测试类代码(Emps实体类不单独贴出)
@Test
public void test5(){//测试jdbc工具类List<Emps> emps = JdbcUtil.rsToList("select * from emps", Emps.class);System.out.println(emps);
}
  • 查询结果

查询dept数据表

  • 这是数据库中的数据
  • 这是测试类代码(Emps实体类不单独贴出)
@Test
public void test5(){//测试jdbc工具类List<Dept> dept = JdbcUtil.rsToList("select * from dept", Dept.class);System.out.println(dept);
}

D

  • 查询结果

git 源码

阿哲学了就来聊——Java反射相关推荐

  1. 浅聊Java反射机制(三)

    引入 即使没有学过反射,大家也一定会见过invoke方法.因为很多方法调用都是靠invoke方法,所以很多异常的抛出都会定位到invoke方法,比如下面的情形大家会很熟悉: java.lang.Nul ...

  2. Java 反射机制和动态代理是基于什么原理,了解过吗?

    工作多年以及在面试中,我经常能体会到,有些面试者确实是认真努力工作,但坦白说表现出的能力水平却不足以通过面试,通常是两方面原因: 1."知其然不知其所以然". 做了多年技术,开发了 ...

  3. 大家都说 Java 反射效率低,为什么呢?

    我们在 Java 开发中,难免会接触到反射,而在一些框架中,反射的运用更是常见.我相信,每次提到反射,大家的第一反应一定是反射效率低,尽量少使用.但是反射的效率到底低多少?反射效率低的原因在哪里?这篇 ...

  4. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

  5. 粗浅看 java反射机制

    Java 反射是 Java 被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运 行时透过 Reflection APIs 取得任何一个已知名称的class 的内部信息,包括其 modifi ...

  6. 大家都说 Java 反射效率低,你知道原因在哪里么

    [这是 ZY 第 17 篇原创技术文章] 预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低的原因 文章概览 我们在 Java 开发中, ...

  7. java反射机制详解_JAVA反射机制详解_JSP/Java编程_互联网开发技术网_传播最新的编程技术_php361.com...

    今天,下午在和朋友聊天的时候,聊起了反射这个话题. 我们就从下面这个段简单的代码开始吧. 这个代码输出什么,想必大部分的读者跟我一样,会很快地知道答案:0 1 2 3 4 5 6 7 8 9.事实也是 ...

  8. 大白话说Java反射:入门、使用、原理,BAT 面试官 如何面试

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 文章 ...

  9. dwr java有返回值但是js获取不到返回值_一探究竟:Java反射效率低的原因到底在哪?...

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低的原因 文章概览 我们在 Java 开发中,难免会接触到反射,而在一些框架中,反射的运 ...

最新文章

  1. iOS 11开发教程(十)iOS11无线连接手机真机测试
  2. SSH 自动断开 解决方案
  3. 转:delphi用URLDownloadToFile下载文件,用进度条跟踪下载进度
  4. MySQL配置主从同步过程记录
  5. mysql 开放远程连接权限连不上
  6. OpenCV OMZ MTCNN人脸检测的实例(附完整代码)
  7. ECSHOP其他页面调用首页的FLASH主广告
  8. c语言程序设计常用语句格式,全国计算机考试二级C语言程序设计要求
  9. JavaScript将焦点设置为HTML表单元素
  10. 我在名牌大学毕业后的经历——曾经努力过,就不会后悔
  11. mysql dcn_Tdsql DCN同步技术原理介绍
  12. 中科探海的海底掩埋物三维实时成像声呐
  13. 图像形态学处理(击中击不中变换 ) 终于搞懂了
  14. java计算器GUI科学型计算器
  15. 打开Flutter动画的另一种姿势——Flare,android面试题选择题
  16. Python赋值语句的详细理解
  17. html中无语义的标签,HTML5 语义元素
  18. Java长盛不衰的12个原因
  19. 【iPhone4s降级】2021年初自制固件降级IOS6.1.3
  20. C# 中获取时间戳的方法

热门文章

  1. react项目中实现打印预览功能
  2. mysql 瘦身_Mysql瘦身方法
  3. Elasticsearch升级1.5版本暴露jdk的bug
  4. 企业网络推广期间网站关键词堆砌是否影响企业网络推广优化?
  5. 初中计算机病毒教学流程图,3904000261《计算机病毒》(高中信息技术)教学设计方案...
  6. 如何掌控自己的时间和生活
  7. php设计模式-适配器
  8. 情不知所起,一“网”而深
  9. 逆向学习litevm篇
  10. python文件写入utf-8_关于utf 8:用Python写入UTF-8文件