基于《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. WebGL学习之纹理贴图

    为了使图形能获得接近于真实物体的材质效果,一般会使用贴图,贴图类型主要包括两种:漫反射贴图和镜面高光贴图.其中漫反射贴图可以同时实现漫反射光和环境光的效果. 实际效果请看demo:纹理贴图 2D纹理 ...

  2. 长沙4月21日开发者大会暨.NET社区成立大会活动纪实

    活动总结 2019年4月21日是一个斜风细雨.微风和煦的美好日子,由长沙.NET技术社区.腾讯云云加社区.微软Azure云技术社区.中国.NET技术社区.长沙柳枝行动.长沙互联网活动基地(唐胡子俱乐部 ...

  3. 【ODI】| 数据ETL:从零开始使用Oracle ODI完成数据集成(一)

    0. 环境说明及软件准备 ODI(Oracle Data Integrator)是Oracle公司提供的一种数据集成工具,能高效地实现批量数据的抽取.转换和加载.ODI可以实现当今大多数的主流关系型数 ...

  4. 【Android Studio安装部署系列】十七、Android studio引用第三方库、jar、so、arr文件

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 在Android开发过程,经常需要用到第三方库以及jar.so.arr文件,那么如何引用到项目中呢?下面简单介绍下. 引用第三方库 ...

  5. 强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)

    在强化学习(十七) 基于模型的强化学习与Dyna算法框架中,我们讨论基于模型的强化学习方法的基本思路,以及集合基于模型与不基于模型的强化学习框架Dyna.本文我们讨论另一种非常流行的集合基于模型与不基 ...

  6. mysql 多实例部署

    Centos7.6 部署3个Mariadb 实例 [root@localhost ~]# yum install mariadb-server -y # 创建对应的目录文件 [root@localho ...

  7. js 异步转同步

    在项目中有些逻辑或者请求依赖另一个异步请求,大家常用的方法是回调函数.现在有个高大上的解决方案:await async . async 是“异步”的简写,而 await 可以认为是 async wai ...

  8. AI2(App Inventor 2)离线版服务器网络版

    个人修改包括: 1.后台增加用户批量添加功能         https://gte.fsyz.net/node/1877 2.上传文件限制改为100M ,编译文件限制改为10M      https ...

  9. 一款Android图文识别与扫描软件

    OCR图文识别App 是一款准确高效的 OCR文字识别与扫描软件,识别准确度高,速度快,扫描文件清晰,可导出TXT.Excel. 免费使用. 技术 基于百度在业界领先的人工智能与深度学习技术,提供对身 ...

  10. Retrofit的初次使用

    rxretrofitlibrary是一个已经写好的网络框架库,先以本地Module导入到自己的项目中. 1.它的初始化操作大多在自定义的application中完成,如: public class A ...