首发于靳刚同学

简单理解反射机制

认识反射

java反射机制使用简单,理解起来却没那么容易,首先看它在维基百科的定义:

反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,那种程序能够“观察”并且修改自己的行为.

在面向对象的编程语言如Java中,反射允许在编译期间不知道接口(类)的名称,字段、方法的情况下在运行时检查类、接口、字段和方法。这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制.

反射的动态性

  • 静态加载类:编译时加载类
  • 动态加载类:运行时加载类

demo:假设现在有4个类,分别为小米,百度,美团,以及一个主类Main,主类中有有个apply方法,代表求职申请,我们需要根据apply(String name)的name属性,动态获取类.此时我们有两种方式:

  • 不适用反射

如果javac Main.java,则必须同时存在 MeiTuan.java,BaiDu.java,XiaoMi.java,因为Main类依赖他们,然而我们很多时候并想加载其中的一个,此时,我们便可以使用反射机制
  • 使用反射

Class company=Class.forName(companyName);

到了这里我们才真正了解了反射的概念,接下来聊聊它的使用

反射的使用

对象是表示或封装一些数据,一个类被加载后,jvm会在方法区创建一个对应该类的Class对象,类的整个结构信息会放到对应的Class对象中。这个Class对象就想一面镜子一样,通过这面镜子我们可以看到对应类的全部信息.通过Class对象,我们可以创建Constructor, Field, Method对象.

  • Class 代表类的对象

获取Class对象的方法:

    1.类名.class
    2.对象.getClass()
    3.Class.forName("className");
  • Constructor 代表类的构造器对象

通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例

//返回有指定参数的构造器(共有)
public Constructor<T> getConstructor(Class<?>... parameterTypes)

//返回所有构造器(共有)
public Constructor<?>[] getConstructors()

//返回有指定参数的构造器(共有和私有)
public Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes)

//返回所有构造器(共有和私有)
public Constructor<?>[] getDeclaredConstructors()

  • Field 代表了类的成员变量
getField(String name)   //获取class对象的公有name字段
getFields()             //获取class对象的所有共有字段

getDeclaredField(name)  //获取class对象name字段,无论是公有还是私有
getDeclaredFields()     //获取class对象所有字段,无论是公有还是私有
  • Method 代表了类的方法对象
public MethodgetMethod(String name,Class<?>... parameterTypes)
public Method[] getMethods()

public MethodgetDeclaredMethod(Stringname,Class<?>... parameterTypes)
public Method[] getDeclaredMethods()

end

我是伯仁,如果喜欢我的文章,欢迎点赞和关注!

编辑于 2017-06-10

文章被以下专栏收录