基于《Java编程思想》第四版

前言

我们要操作一个类实例对象时,一般都要先知道这个类有哪些方法或者成员变量。反射就是在我们不知道这个类有哪些方法或成员变量时,使用特定方式得到类的这些信息,再根据特定规则去调用对应的方法操作类实例对象。

这中间有两个未知条件

  • 如何记录类信息
  • 如何确定规则

类信息是通过Class记录的,规则是由程序员定的。

Class

Class是一个记录类信息的类,每个类(包括Class)都会有一个Class对象。其实现也很好猜测和理解:编译器扫描完代码,就能知道类的具体信息,比如有哪些方法,然后把这些信息保存到Class对象中。

因为Class对象并不是程序员自己实例化的,所以必须得有一个确定的名字,约定就叫做class。我们可以通过访问class对象得到类的信息。

为了获取class对象,有三种方法

  • 通过类名.class直接访问
Class c = Integer.class;
  • 通过Class.forName(类名)函数获取(可能抛出异常,需要放在try catch中)
Class c = Class.forName("Integer");
  • 通过对象.class获取
Integer n = new Integer ();
Class c = n.getClass();

不论通过哪种方式获取的class对象都是同一个对象,也就是说每个类全局只有一个class对象。可以查看文档知道Class有哪些接口,以后多用用就会熟能生巧了。

反射

当我们使用反射时,除了Class对象记录的信息外,还需要一个规则来约束实现者和使用者。

假定有一个持久化功能的规则如下

  • 创建表时,表名和列名均为帕斯卡格式
  • 使用者存储信息时,使用类似表名.列名=值的方式
  • 实现的持久化类需要以表名做为类名,以列名作为成员变量名,以set+成员变量名作为方法名,方法名中的成员变量名为帕斯卡格式

按照这个规则实现一个使用了反射的持久化函数,里面没有具体的类型

// 略去了异常处理的代码
public static void save( String s ) {
    String[] tmp = s.split("\\.");
    String table = tmp[0];
    String column = tmp[1].split("=")[0];
    String value = tmp[1].split("=")[1];

    Class c = Class.forName(table);
    Method m = c.getMethod("set" + column, String.class);
    Object o = c.getConstructor().newInstance();
    m.invoke(o,value);
}

按规则要求实现两个持久化类

class Book{
    private String name;

    public Book(){

    }
    public void setName(String name){
        this.name = name;
        System.out.println("Book name = " + name);
    }
}

class Person{
    private String name;

    public Person(){

    }
    public void setName(String name){
        this.name = name;
        System.out.println("Person name = " + name);
    }
}

使用者无需关注具体类型,就可以完成存储功能

public static void main(String[] args) {
    save("Person.Name=Jack");
    save("Book.Name=Five");
}

后续有新增的持久化类时,只要按照规则实现,也能直接嵌入到这个框架中了。

结语

有很多框架都使用了反射机制,后面还要继续深入去了解反射的使用方式。

Java学习点滴——Class和反射的更多相关文章

  1. Java学习笔记之使用反射+泛型构建通用DAO

    PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...

  2. Java学习笔记54(反射详解)

    反射概念: java反射机制是在运行状态中,对于任意一个类,都能知道所有属性和方法 对于任意一个对象都能调用它的任意一个方法和属性,这种动态获取和调用的功能称为java的反射机制 实际作用: 已经完成 ...

  3. Java学习点滴——Integer缓存

    前言 一切从下面这段代码开始 public static void test(String[] agrs){ Integer a = 1; Integer b = 2; System.out.prin ...

  4. Java学习点滴——泛型

    基于<Java编程思想>第四版 前言 虽然Java的泛型在语法上和C++相比是类似的,但在实现上两者是全然不同的. 语法 Java只需要一个<>就可定义泛型.在<> ...

  5. Java学习点滴——初识Java

    基于<Java编程思想>第四版 前言 "程序就是算法加数据结构",而算法就是控制语句加操作符,编写一个程序就是使用控制语句加操作符去操作数据结构,因此我从Java的控制 ...

  6. Java学习笔记八(反射)

    1.介绍 反射为Java程序在执行时提供了动态的能力.利用反射能够在执行时对程序进行动态的控制.本篇博客着重解说一下Java中的反射. 2.Class类的使用 在Java执行过程中,每一个类被载入后都 ...

  7. Java学习笔记--注解和反射

    注解和反射 1. 注解 注解作用: 对程序做出解释 被其他程序读取 注解格式: @注释名,还可以添加一些参数值,例如@SuppressWarnings(value="unchecked&qu ...

  8. Java学习点滴——对象实例化

    基于<Java编程思想>第四版 构造与析构 在C++中通过构造函数和析构函数来保证:对象在使用前被正确初始化,在使用后被正确回收.Java中同样存在构造函数,但是没有析构函数.之所以没有析 ...

  9. java学习之反射机制

    java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...

随机推荐

  1. Android LayoutInflater源码解析:你真的能正确使用吗?

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 好久没写博客了,最近忙着换工作,没时间写,工作刚定下来.稍后有时间会写一下换工作经历.接下来进入本篇主题,本来没想写LayoutInflater的 ...

  2. koa+mysql+vue+socket.io全栈开发之数据访问篇

    后端搭起大体的框架后,接着涉及到的就是如何将数据持久化的问题,也就是对数据库进行 CURD 操作. 关于数据库方案, mongodb 和 mysql 都使用过,但我选用的是 mysql,原因: 目前为 ...

  3. SpringCloud学习系列之六 ----- 路由网关Zuul基础使用教程

    前言 在上篇中介绍了SpringCloud Config的完美使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由网关 ...

  4. Java进阶篇设计模式之五-----外观模式和装饰器模式

    前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...

  5. WPF 小小案列(同步异步)

    private void BtnButton_Click(object sender, RoutedEventArgs e) { MessageBox.Show("hello Word&qu ...

  6. revit二次开发addin文件

    command命令: <?xml version="1.0" encoding="utf-8"?> <RevitAddIns> < ...

  7. 记一次DDOS攻击防御实录

    前言     笔者所在单位是一家小型创业公司,目前产品正在成长阶段,日活跃用户只有区区几万人次,并发只有日均 85/QPS,自建机房,带宽 100MB.在这样的背景下,完全没想过一个小产品会招来黑客的 ...

  8. 当心Azure跨区域数据传输产生额外费用

    最近同事发现Azure上一台虚拟机的费用环比增加了一部分.后面仔细检查发现费用来自数据传输, 因为这是早期部署的一台Azure虚拟机(Iaas),我们在本地生成备份,然后通过AzCopy到存储账号的B ...

  9. python 简史

    ---恢复内容开始--- Python的作者,Guido von Rossum,确实是荷兰人.1982年,Guido从阿姆斯特丹大学(University of Amsterdam)获得了数学和计算机 ...

  10. windows无人值守文件的制作_autounattend.xml

    网址:http://www.windowsafg.com/office2010.html  Note:网络不能是国内网络(需要FQ),否则不能生成自动应答文件. 以Windows10为例:Window ...