JAVA反射机制实例详解

 更新时间:2015年11月10日 10:59:33   作者:刘佳翰  
这篇文章主要介绍了JAVA反射机制,以实例形式较为详细的分析讲解了Java反射机制的具体概念、功能与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例分析了JAVA反射机制。分享给大家供大家参考,具体如下:

反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧!

一、先看一下反射的概念:

主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!
看概念很晕的,继续往下看。

二、反射机制的作用:

1、反编译:.class-->.java
2、通过反射机制访问java对象的属性,方法,构造方法等;
这样好像更容易理解一些,下边我们具体看怎么实现这些功能。

三、在这里先看一下sun为我们提供了那些反射机制中的类:

java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;

很多反射中的方法,属性等操作我们可以从这四个类中查询。还是哪句话要学着不断的查询API,那才是我们最好的老师。

四、具体功能实现:

1、反射机制获取类有三种方法,我们来获取Employee类型

//第一种方式: 
Classc1 = Class.forName("Employee"); 
//第二种方式: 
//java中每个类型都有class 属性. 
Classc2 = Employee.class; 
//第三种方式: 
//java语言中任何一个java对象都有getClass 方法 
Employeee = new Employee(); 
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)

2、创建对象:获取类以后我们来创建它的对象,利用newInstance:

Class c =Class.forName("Employee");
//创建此Class 对象所表示的类的一个新实例
Objecto = c.newInstance(); //调用了Employee的无参数构造方法.

3、获取属性:分为所有的属性和指定的属性:

①、先看获取所有的属性的写法:

//获取整个类
Class c = Class.forName("java.lang.Integer");
//获取所有的属性?
Field[] fs = c.getDeclaredFields();
//定义可变长的字符串,用来存储属性
StringBuffer sb = new StringBuffer();
//通过追加的方法,将每个属性拼接到此字符串中
//最外边的public定义
sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
//里边的每一个属性
for(Field field:fs){
    sb.append("\t");//空格
    sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等
    sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字
    sb.append(field.getName()+";\n");//属性的名字+回车
}
sb.append("}");
System.out.println(sb);

②、获取特定的属性,对比着传统的方法来学习:

public static void main(String[] args) throws Exception{ 
<span style="white-space:pre"> </span>//以前的方式: 
  /* 
  User u = new User(); 
  u.age = 12; //set 
  System.out.println(u.age); //get 
  */ 
  //获取类 
  Class c = Class.forName("User"); 
  //获取id属性 
  Field idF = c.getDeclaredField("id"); 
  //实例化这个类赋给o 
  Object o = c.newInstance(); 
  //打破封装 
  idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。 
  //给o对象的id属性赋值"110" 
  idF.set(o, "110"); //set 
  //get 
  System.out.println(idF.get(o)); 
} 

4、获取方法,和构造方法,不再详细描述,只来看一下关键字:


方法关键字

含义

getDeclaredMethods()

获取所有的方法

getReturnType()

获得方法的放回类型

getParameterTypes()

获得方法的传入参数类型

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

获得特定的方法

 

 

构造方法关键字

含义

getDeclaredConstructors()

获取所有的构造方法

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

获取特定的构造方法

 

 

父类和父接口

含义

getSuperclass()

获取某类的父类

getInterfaces()

获取某类实现的接口

  

这样我们就可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。

五、反射加配置文件,使我们的程序更加灵活:

在设计模式学习当中,学习抽象工厂的时候就用到了反射来更加方便的读取数据库链接字符串等,当时不是太理解,就照着抄了。看一下.NET中的反射+配置文件的使用:

当时用的配置文件是app.config文件,内容是XML格式的,里边填写链接数据库的内容:

<configuration>
<appSettings>
<add key="" value=""/>
</appSettings>
</configuration>

反射的写法:

assembly.load("当前程序集的名称").CreateInstance("当前命名空间名称".要实例化的类名); 

这样的好处是很容易的方便我们变换数据库,例如我们将系统的数据库从SQL Server升级到Oracle,那么我们写两份D层,在配置文件的内容改一下,或者加条件选择一下即可,带来了很大的方便。

当然了,JAVA中其实也是一样,只不过这里的配置文件为.properties,称作属性文件。通过反射读取里边的内容。这样代码是固定的,但是配置文件的内容我们可以改,这样使我们的代码灵活了很多!

综上为,JAVA反射的再次学习,灵活的运用它,能够使我们的代码更加灵活,但是它也有它的缺点,就是运用它会使我们的软件的性能降低,复杂度增加,所以还要我们慎重的使用它。

希望本文所述对大家Java程序设计有所帮助。

相关文章

  • Java数据库连接池的几种配置方法(以MySQL数据库为例)

    Java数据库连接池的几种配置方法(以MySQL数据库为例)

    这篇文章主要介绍了Java数据库连接池的几种配置方法(以MySQL数据库为例) 的相关资料,需要的朋友可以参考下
    2016-07-07
  • java中几种http请求方式示例详解

    java中几种http请求方式示例详解

    在日常工作和学习中有很多地方都需要发送HTTP请求,下面这篇文章主要给大家介绍了关于java中几种http请求方式的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • MyBatis-Plus Generator配置详解

    MyBatis-Plus Generator配置详解

    这篇文章主要介绍了MyBatis-Plus Generator配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java中如何读取和写入zip文件问题

    Java中如何读取和写入zip文件问题

    这篇文章主要介绍了Java中如何读取和写入zip文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Java静态工厂方法的实例详解

    Java静态工厂方法的实例详解

    这篇文章主要介绍了 Java静态工厂方法的实例详解的相关资料,希望通过本文大家能掌握java今天工厂方法,需要的朋友可以参考下
    2017-09-09
  • Windows下apache ant安装、环境变量配置教程

    Windows下apache ant安装、环境变量配置教程

    这篇文章主要介绍了Windows下apache ant安装、环境变量配置教程,ANT的安装很简单,本文同时讲解了验证安装是否成功的方法和使用方法实例,需要的朋友可以参考下
    2015-06-06
  • SpringBoot统一数据返回的几种方式

    SpringBoot统一数据返回的几种方式

    在Web应用程序开发中,统一数据返回格式对于前后端分离项目尤为重要,本文就来介绍一下SpringBoot统一数据返回的几种方式,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • Spring mvc工作原理_动力节点Java学院整理

    Spring mvc工作原理_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Spring mvc工作原理的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • springmvc+spring+mybatis实现用户登录功能(下)

    springmvc+spring+mybatis实现用户登录功能(下)

    这篇文章主要为大家详细介绍了springmvc+spring+mybatis实现用户登录功能的第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • SpringBoot使用validation-api实现对枚举类参数校验的方法

    SpringBoot使用validation-api实现对枚举类参数校验的方法

    这篇文章主要介绍了SpringBoot使用validation-api实现对枚举类参数校验,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11

最新评论