Java中非常有特点的一个机制就是「反射」。反射可以理解为与正射相对立,正射就是我们知道一个类的作用,通过实例化一个实例对象,直接调用其方法。

例如定义如下一个Orange类:

public class Orange {private int price;public String name;public void setPrice(int price){this.price = price;}public int getPrice(){return this.price;}
}

我们已经知道这个类有一个私有域price,以及两个方法。正射的过程如下:

        Orange o1 = new Orange();o1.setPrice(5);System.out.println(o1.getPrice());

正射就是直接实例化已知类的对象,通过对象调用类的方法。它在编译的时候就已经知道属于什么类,而反射在编译阶段并不会知道要初始化的类对象是什么,因此无法通过new来创造实例,而是在运行阶段,通过反射机制来了解到要操作的类是什么,并获得类的构造,以及调用类的方法。

具体如下面的代码:

        try{Class clz = Class.forName("pack2.Orange");Constructor orangeConstructor = clz.getConstructor();Orange o2 = (Orange)orangeConstructor.newInstance();Method setPriceMethod = clz.getMethod("setPrice", int.class);setPriceMethod.invoke(o2, 10);System.out.println(o2.getPrice());}catch (Exception e){e.printStackTrace();}

下面对这些代码进行详细解析。

Class类

在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的类型标识,这个信息跟踪者每个对象所属的类,保存这些信息的类称为Class。

有如下三种方式得到Class对象:

1.使用静态方法Class.forName(),在知道类的路径时就可以使用:

Class clz = Class.forName("pack2.Orange");

2.使用.class方法,只适用于编译时就知道要操作的class:

Class clz2 = String.class;

3.使用类对象的getClass()方法:

String str1 = new String("abc");
Class clz2 = str1.getClass();

创造Class对象

有两种方式创造Class实例对象:

1.通过Class对象的newInstance()方法,这种方式只能调用无参的构造方法;

Class clz = Class.forName("pack2.Orange");
Orange o3 = (Orange)clz.newInstance();

2.通过Constructor对象的newInstance()方法,这种方式可以任意指定实例化时的构造方法:(代码中还是无参构造方法,可以自己改写下)

Class clz = Class.forName("pack2.Orange");
Constructor orangeConstructor = clz.getConstructor();
Orange o2 = (Orange)orangeConstructor.newInstance();

Field,Method与Constructor

Field,Method和Constructor都可以利用反射分析类的能力,分别描述类的域,类的方法和类的构造器。这三个类都有一个getName方法,用于返回项目的名称(编译时类型,有别于运行时类型)。

Field

Field[] fields = clz.getFields();
for(Field field: fields)
{System.out.println(field);System.out.println(field.getName());
}

输出为:

public java.lang.String pack2.Orange.name
name

可见Class对象的getFields方法只能得到非私有域,如果想要得到私有变量,需要使用getDeclaredFields

Method和Constructor也是类似的,在此不重复介绍了。

invoke函数

值得注意的是,Method类中有一个invoke成员方法,可以利用invoke方法调用一个对象所描述的方法:

setPriceMethod.invoke(o2, 10);

括号里的参数第一个为类对象,后面的参数长度是可变的,与Method对象所描述的方法的参数对应。

最简单的Java反射机制相关推荐

  1. Java反射机制深度剖析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java反射机制是Java语言中一种很重要的机制,可能在工作中用到的机会不多,但是在很多框架中都有用到这种机制.我们知道Java是一门静态 ...

  2. java反射机制的简单使用和优缺点

    java反射机制的使用 一.反射是什么? JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类信息以及动 ...

  3. Java反射机制(简单易懂)

    文章目录 前言 一.反射机制 二.反射的用途 三.反射相关的类(重要) 3.1 Class类(反射机制的起源 ) 3.2 通过反射调用构造方法 3.3 通过反射调用普通方法 3.4 通过反射调用类属性 ...

  4. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  5. java基础-java反射机制

    2019独角兽企业重金招聘Python工程师标准>>> 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩" ...

  6. 利用java反射机制进行对象操作

    我们经常使用COMMONS-BEANUTILS包来进行bean的操作,例如从map到bean获从bean到map的映射,那么实现的原理是什么呢,下面举个简单的操作的例子:首先,我建立一个bean pu ...

  7. Java反射机制及API使用

    原文地址 反射简单来说,就是动态加载对象,并对对象进行剖析.在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道并获取这个类的所有属性和方法. Java反射机制的作用: 在运行时判断任意 ...

  8. Java反射机制demo(四)—获取一个类的父类和实现的接口

    2019独角兽企业重金招聘Python工程师标准>>> Java反射机制demo(四)-获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的get ...

  9. 工作中用到的java反射机制_(转)JAVA-反射机制的使用

    Java反射机制的实现原理 反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠 ...

最新文章

  1. 管理者如何打造一个有执行力的团队?
  2. java实验的技术问题及解决方法,2018-2019-2 20175313 实验一《Java开发环境的熟悉》实验报告...
  3. GDCM:gdcm::ByteBuffer的测试程序
  4. 洛谷——P2018 消息传递
  5. codeforces C. Vanya and Scales
  6. vue2 枚举类型转换
  7. 比较大小教案计算机西瓜,比较大小小班教案
  8. 音乐后期处理:音乐失真效果制作
  9. 如何使用Aiseesoft Mac FoneTrans传输和管理iOS文件
  10. Html5 dataset--自定义属性
  11. 关于 com.lowagie.text 报错的问题
  12. [Qualcomm][Debug] 不用软件抓QXDM LOG
  13. HTML网易云音乐页面设计,QtDesigner实现网易云音乐助手的页面设计
  14. 结构化程序设计与面向对象程序设计特点
  15. pta新浪微博热门话题
  16. pythonsin怎么表示_Python numpy.sin()用法及代码示例
  17. Asset Pricing:Asset Pricing Formula
  18. 仿微信朋友圈图片点击放大效果
  19. 初次学习Docker没什么经验记录下的笔记
  20. win7计算机锁频图片怎么设置,win7锁屏壁纸怎么换_win7更换锁屏壁纸的操作方法...

热门文章

  1. [转]Linux桌面现状素描:矛盾的时代
  2. 前后端分离实现在线记账功能,前端使用vue,后端使用springmvc
  3. 取消wps右键菜单_WPS演示技巧—制作浪漫表白动态演示PPT
  4. 英语: 句法(Syntax Defined)
  5. MOOG伺服阀D633-7205
  6. chrome 插件把 json 导出为 excel
  7. 关于libjpeg修改图片质量的讨论
  8. 分体式空调控制器厂家对比
  9. 为什么铝电解电容滤低频信号而瓷片电容滤高频信号?
  10. 凯撒密码(加密与解密)