阿哲学了就来聊——Java反射
阿哲学了就来聊——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反射相关推荐
- 浅聊Java反射机制(三)
引入 即使没有学过反射,大家也一定会见过invoke方法.因为很多方法调用都是靠invoke方法,所以很多异常的抛出都会定位到invoke方法,比如下面的情形大家会很熟悉: java.lang.Nul ...
- Java 反射机制和动态代理是基于什么原理,了解过吗?
工作多年以及在面试中,我经常能体会到,有些面试者确实是认真努力工作,但坦白说表现出的能力水平却不足以通过面试,通常是两方面原因: 1."知其然不知其所以然". 做了多年技术,开发了 ...
- 大家都说 Java 反射效率低,为什么呢?
我们在 Java 开发中,难免会接触到反射,而在一些框架中,反射的运用更是常见.我相信,每次提到反射,大家的第一反应一定是反射效率低,尽量少使用.但是反射的效率到底低多少?反射效率低的原因在哪里?这篇 ...
- Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态
Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...
- 粗浅看 java反射机制
Java 反射是 Java 被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运 行时透过 Reflection APIs 取得任何一个已知名称的class 的内部信息,包括其 modifi ...
- 大家都说 Java 反射效率低,你知道原因在哪里么
[这是 ZY 第 17 篇原创技术文章] 预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低的原因 文章概览 我们在 Java 开发中, ...
- java反射机制详解_JAVA反射机制详解_JSP/Java编程_互联网开发技术网_传播最新的编程技术_php361.com...
今天,下午在和朋友聊天的时候,聊起了反射这个话题. 我们就从下面这个段简单的代码开始吧. 这个代码输出什么,想必大部分的读者跟我一样,会很快地知道答案:0 1 2 3 4 5 6 7 8 9.事实也是 ...
- 大白话说Java反射:入门、使用、原理,BAT 面试官 如何面试
写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 文章 ...
- dwr java有返回值但是js获取不到返回值_一探究竟:Java反射效率低的原因到底在哪?...
预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低的原因 文章概览 我们在 Java 开发中,难免会接触到反射,而在一些框架中,反射的运 ...
最新文章
- iOS 11开发教程(十)iOS11无线连接手机真机测试
- SSH 自动断开 解决方案
- 转:delphi用URLDownloadToFile下载文件,用进度条跟踪下载进度
- MySQL配置主从同步过程记录
- mysql 开放远程连接权限连不上
- OpenCV OMZ MTCNN人脸检测的实例(附完整代码)
- ECSHOP其他页面调用首页的FLASH主广告
- c语言程序设计常用语句格式,全国计算机考试二级C语言程序设计要求
- JavaScript将焦点设置为HTML表单元素
- 我在名牌大学毕业后的经历——曾经努力过,就不会后悔
- mysql dcn_Tdsql DCN同步技术原理介绍
- 中科探海的海底掩埋物三维实时成像声呐
- 图像形态学处理(击中击不中变换 ) 终于搞懂了
- java计算器GUI科学型计算器
- 打开Flutter动画的另一种姿势——Flare,android面试题选择题
- Python赋值语句的详细理解
- html中无语义的标签,HTML5 语义元素
- Java长盛不衰的12个原因
- 【iPhone4s降级】2021年初自制固件降级IOS6.1.3
- C# 中获取时间戳的方法
热门文章
- react项目中实现打印预览功能
- mysql 瘦身_Mysql瘦身方法
- Elasticsearch升级1.5版本暴露jdk的bug
- 企业网络推广期间网站关键词堆砌是否影响企业网络推广优化?
- 初中计算机病毒教学流程图,3904000261《计算机病毒》(高中信息技术)教学设计方案...
- 如何掌控自己的时间和生活
- php设计模式-适配器
- 情不知所起,一“网”而深
- 逆向学习litevm篇
- python文件写入utf-8_关于utf 8:用Python写入UTF-8文件