java反射知识点简单回顾

来源:互联网 发布:linux reboot后起不来 编辑:程序博客网 时间:2024/05/16 08:27

背景:最近在web开发项目中,导师将在项目中的DBHelper(用于访问数据库数据)类封装了基于对象查询的方法,该方法大量使用到了Java的发射机制,所以接下来就简单回顾一下关于反射的知识。

反射的定义

能够分析类能力的程序被称为反射。

什么情况下将应用反射机制:

  1. 在运行分析类的能力
  2. 在运行时查看对象
  3. 实现数组的操作代码
  4. 利用Method对象

Class类

Java反射主要通过Class类来进行操作。

在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息保存着每个对象所属的类足迹,保存这些信息的正是Class类,所有类的对象都是Class的实例。

一、获取Class类实例(对象)的方法

  1. Object类中的getClass()返回Class对象
  2. 通过Class的静态方法forName(String className)获得字符串对应的Class对象
  3. 如果T是Java类的类型,那么可以通过T.class获取Class对象

二、Class类的方法

  1. Class类的newInstance()可以用来快速创建一个类的实例,即调用构造器。
  2. Class类的getName()可以获得完整的包名和类名。getSimpleName()可以获得类名。

    Class c = Class.forName("java.util.Date");Object m = c.newInstance();m.getClass().getName();//output: java.util.Datem.getClass().getSimpleName();//output:Date

检查类的结构

我们回顾一下类的结构:

  1. 类的域(字段),即我们通常所说的全局属性。
  2. 类的方法,用来“做事”。
  3. 构造器(或者说构造方法),用来初始化对象。

在java.lang.reflect包中有三个类Field、Method和Constructor分别用于描述以上三个结构。

Class类中的getFields()、getMethods()、getConstructor()方法分别返回类支持的public域、方法和构造器数组,其中包括父类的共有成员。

Class类中的getDeclareFields()、getDeclareMethods()、getDeclareConstructors()方法分别返回类中的声明全部域、方法和构造器组成的数组包括私有成员跟受保护成员,但不包括父类的成员

Method类

我们可以通过Class类的getMethods() 或者getDeclareMethods()来获得Method类的对象。在Method类中有一个invoke()方法,它允许调用包装在当前Method对象中的方法。调用的语法如下:

Object invoke(Obeject obj,Object...args)

第一个参数是Class的对象名 当然第一个参数也可以省略(如静态方法)。

第二个参数:(其实不能说是第二个参数,它是一个参数列表,具体看包装在Method类对象中的方法参数列表)。

Method类中也有getName()方法,它以 String 形式返回此 Method 对象表示的方法名称。

getModifiers(),以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符。应该使用 Modifier 类对修饰符进行解码。

getModifiers()方法因为以整数形式返回语言修饰符,所以需要将它解码,可以通过Mofifiers类的静态方法toString(int mod)进行解码。(语言修饰符就是public protected private 这种鬼,详细看Modifier类的帮助文档)

总结

反射机制功能很强大,这里很浅显回顾了一下关于反射的知识点。这里我推荐一篇关于java反射详解的博客,里面内容都是以代码形式 的例子,大家可以看一看。

0 0