既然这篇文章我要说的是反射,那么我们就先说一下什么是反射。

反射

反射是在代码运行过程中,可以动态的获取一个类的属性和方法,也可以调用任何一个类的属性和方法。这种动态的获取类的属性和动态的调用方法的机制称为反射机制,放在java中,就被称为java的反射机制。有时候我们会说一个程序有很强的动态性,其实最基本的原理就是用到了咱们的反射原理。

例如我们在链接数据库的时候会把链接数据库的字符串写到配置文件中,这个时候我们用的就是java的反射机制,有时候我们用到的一些变量,我们也不会把这个变量写死到程序中,我们也会放到配置文件中,这也是反射,当然这个只是反射的冰山一角,今天我们就好好的说一下反射。

Reflection

尽管在传统的定义中,java不是一个动态语言,但是java提供了一个Reflection,这个类可以让我们动态的去加载类,属性和方法。

反射的运用

       假设我们有这么一个要求,我需要一个Hello的类的sayHello的方法,这个方法可能被中国人执行:你好。也可能被外国人执行,那就是:"Hello",这样的话我需要写两个类来实现一个接口,一个sayHello的接口,但是我需要两个类来实现,那么好了,如果我今天用的是中国人的sayHello(),明天用外国人的几口来实现,怎么办。这个时候就是反射的用处了。

下边我就先写一个简短的接口lpackage Reflect;

package Reflect;/*** 一个中国的人的接口* @author mengh**/
interface Person{public static final String name="zhangsan";public static int age=20;public void sayHello(String name,int age);public void saySex(String sex);
}/*** 一个中国人的类* @author mengh**/
class Chinese implements Person{private String flag;public Chinese(){}public Chinese(String flag){System.out.println(flag);this.flag = flag;}@Overridepublic void sayHello(String name, int age) {System.out.println("中国人:" + name + " " + age + "你好");      }@Overridepublic void saySex(String sex) {System.out.println(sex);     }}/*** 一个外国人的类* @author mengh**/
class Foreign implements Person{private String flag;public Foreign(){}public Foreign(String flag){System.out.println(flag);this.flag = flag;}@Overridepublic void sayHello(String name, int age) {System.out.println("外国人:" + name + " " + age + "Hello");      }@Overridepublic void saySex(String sex) {System.out.println(sex);}}

然后我们写个方法,来分别获取他的类型,方法名和执行方法。

public class Hello {public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{Class<?> demo = null;try {//通过完整的类型路径获取类demo = Class.forName("Reflect.Chinese");} catch (Exception e) {e.printStackTrace();}//通过newInstance()来创建对象Object obj = demo.newInstance();//使用默认构造函数获取对象Object objType =  demo.getConstructor(new Class[]{}).newInstance(new Object[]{});//获取objType的sayHello方法Method helloMethod = demo.getMethod("sayHello",new Class[]{String.class,int.class});//执行demo里边的sayHello()方法,Object result = helloMethod.invoke(objType, new Object[]{"张三",new Integer(25)});//创建一个带有构造函数参数的类对象Object objType2 = demo.getConstructor(new Class[] {String.class}).newInstance(new Object[]{"这是一个带参数的构造函数"});Method methodCon = demo.getMethod("saySex",new Class[]{String.class});methodCon.invoke(objType2,new Object[]{"我是一个男的,而且是个帅哥"});Field[] fs = demo.getDeclaredFields();for (Field field : fs) {//Modifiers是private的, 申明的字段属性field.getType().getSimpleName(),field.getName()获取变量变量名称,filed的所属类别  System.out.println(Modifier.toString(field.getModifiers()) + " " + field.getType().getSimpleName() + " "  + field.getName() + " " + field.getClass() );}}
}

结果如下:


        说了这么多,写了这么多,我想大家对反射也有了一个基本的认识,在代码中,我从没有写过Chinese和Forgin这两个类的引用,但是我一样可以执行里边的方法,包括构造函数。这样也就实现了他的动态语言的效果。

如果还觉得这样写有些乱,这里有一个基本的表格,大家可以参考,用来获取对应的属性或者方法。

方法关键字

含义

getDeclaredMethods()

获取所有的方法

getReturnType()

获得方法的放回类型

getParameterTypes()

获得方法的传入参数类型

getDeclaredMethod("方法名",参数类型.class,……)

获得特定的方法

构造方法关键字

含义

getDeclaredConstructors()

获取所有的构造方法

getDeclaredConstructor(参数类型.class,……)

获取特定的构造方法

父类和父接口

含义

getSuperclass()

获取某类的父类

getInterfaces()

获取某类实现的接口

说到这里,相信大家对反射也有一个基本的认识了,其实非常的简单,就是   Class<>里边的一些属性和方法的调用,然后我们在XML里边读取对应的属性就可以了,是不是非常的简单。下篇文章我们介绍反射和泛型的关系。

java反射机制和运用相关推荐

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

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

  2. Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...

    Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn   发布于:2012-09-15 ...

  3. Java反射机制分析指南

    一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...

  4. 反射 字段_详解面试中常考的 Java 反射机制

    反射(Reflection) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性和方法. 反射是一项高级 ...

  5. 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】...

    方法1:通过get()方法获取属性值 package com.sxd.test.controller;public class FirstCa{private Integer num;private ...

  6. java基础-java反射机制

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

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

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

  8. java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点

    关注程序员7歌,一起用技术改变世界 大家好,我是程序员7歌,今天我为大家讲解Java的反射机制. 首先我们来看看反射的概念: Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和 ...

  9. java继承 映射_hibernate继承关系映射和java反射机制的运用

    转:http://blog.csdn.net/derpvailzhangfan/article/details/1957946 ,感谢博主分享 Notes:hibernate元数据的运用:uuid的概 ...

  10. java初反射_初始 java 反射机制 (一)

    反射机制详解 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为j ...

最新文章

  1. 公示 | 清华大学大数据研究中心“RONG”奖学金获奖名单
  2. 为什么查询sap数据库表的时候前面要加sapsr3
  3. 1.常用字符对象方法
  4. JVM学习 - 体系结构 内存模型
  5. nginx php环境搭建_php+nginx环境配置
  6. 2021南京大学计算机复试线,南京大学2021年硕士研究生复试基本分数线
  7. java获取屏幕截图
  8. 多线程——java练习题
  9. (时间表达式)定时任务Quartz 之 cron表达式及在线生成器
  10. php dwg转pdf文件怎么打开,CAD转PDF怎么转为黑白的PDF文件
  11. csharp进阶练习题:谜机 - 第1部分:插板【难度:2级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练
  12. MATLAB如何创建新文件夹-mkdir函数,如何进入指定文件夹-cd函数
  13. java clh_CLH lock 原理及JAVA实现
  14. 明日之后说正在连接服务器,手游明日之后一直正在连接服务器
  15. 【填坑日记】list集合的remove方法移除不了?!
  16. SQL语句,数据库增加、删除、修改、查询
  17. iOS 单元测试- 入门学习2
  18. 解决maven打jar包时不把依赖打包进去的问题
  19. 第1章关键角色及其职责——明确职责
  20. 网络工程师职业规划及发展前景

热门文章

  1. 服务器优盘启动安装win7系统教程,u盘装win7系统详细教程图解
  2. 懒人版黑苹果mbr安装_BIOS+MBR硬盘,一步一步教你怎么用clover装黑苹果
  3. cpuz测试分数天梯图_2019年CPU单核跑分天梯图V1.22版(190712)
  4. 2010-2012迷你博客
  5. 我的世界服务器存档的文件夹,我的世界存档在哪个文件夹
  6. Discuz淘宝客网站模板/迪恩淘宝客购物风格商业版模板
  7. MLX90614使用和组装的说明
  8. linux中firewalld之direct rules和rich rules(转发,伪装)
  9. 功率因数 matlab,基于MATLAB的有源功率因数校正器设计
  10. php杨辉三角的规律,杨辉三角的规律以及定理