基于《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. 集群IPtables转发与防火墙

    子网集群通过接入公网的服务器Iptables转发上网 1. 对iptables进行初始化工作 清空filter表 iptables -F 清空nat表 iptables -t nat -F 默认禁止所 ...

  2. mip-link 组件功能升级说明

    背景描述 某个页面被多少页面引用(在其他页面上有指向这个页面的 a 标签),是搜索引擎判断这个页面价值的其中一个因子.这里的搜索引擎不只是指百度,还包括国内外其他的搜索引擎. MIP 在最初设计 MI ...

  3. 基于Token认证的多点登录和WebApi保护

    在文章中有错误的地方,或是有建议或意见的地方,请大家多多指正,邮箱: linjie.rd@gmail.com 一天张三,李四,王五,赵六去动物园,张三没买票,李四制作了个假票,王五买了票,赵六要直接F ...

  4. Axure RP8 注册码

    升级了 8.1.0.3381版本后,需要使用下面这组注册码 License:zdfansKey:fZw2VoYzXakllUuLVdTH13QYWnjD6NZrxgubQkaRyxD5+HNMqdr+ ...

  5. 一段简单的显示当前页面FPS的代码

    写前端代码,尤其是做一个前端框架的时候,经常需要及时知道代码的大致性能,这时候如果能有个好的办法能一直看到当前页面的fps就好了. 整体思路是一秒有一千毫秒,先记录当前时间作为最后一次记录fps的时间 ...

  6. Python进阶:设计模式之迭代器模式

    在软件开发领域中,人们经常会用到这一个概念——“设计模式”(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础 ...

  7. C# ASP.NET MVC:使用Cookie记住账号密码

    MVC记住账号密码 使用cookie操作 前端: <div> 用户名:<input type="text" id="UserName" val ...

  8. js 原型,原型链,原型链继承浅析

    对于网上的关于原型,原型链和原型链继承的晦涩语言说明就不累赘了,复制粘贴过来再解释一遍怕自己也整蒙了,本人最怕空气突然安静,四目对视,大眼对小眼,一脸懵逼. 我们先看下面

  9. Odoo Linux服务器一键安装脚本使用指南

    Odoo安装脚本介绍 为了帮助更多Linux服务器维护人员快速部署Odoo,为此开源智造(OSCG)基于André Schenkels曾经开放的openerp-install-scripts所构建的基 ...

  10. ArcGIS JS Api 4.x修改三维球背景技巧

        通过修改scenceview.js中tileBackground和defaultTileBackground中的png的base64编码就可以达到要求. 4.8中通过修改scenceview. ...