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类型

[java] view plain copy print ?

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


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

[java] view plain copy print ?

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



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

a,先看获取所有的属性的写法:

[java] view plain copy print ?

  1. //获取整个类
  2. Classc=Class.forName("java.lang.Integer");
  3. //获取所有的属性?
  4. Field[]fs=c.getDeclaredFields();
  5. //定义可变长的字符串,用来存储属性
  6. StringBuffersb=newStringBuffer();
  7. //通过追加的方法,将每个属性拼接到此字符串中
  8. //最外边的public定义
  9. sb.append(Modifier.toString(c.getModifiers())+"class"+c.getSimpleName()+"{\n");
  10. //里边的每一个属性
  11. for(Fieldfield:fs){
  12. sb.append("\t");//空格
  13. sb.append(Modifier.toString(field.getModifiers())+"");//获得属性的修饰符,例如public,static等等
  14. sb.append(field.getType().getSimpleName()+"");//属性的类型的名字
  15. sb.append(field.getName()+";\n");//属性的名字+回车
  16. }
  17. sb.append("}");
  18. System.out.println(sb);


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


[java] view plain copy print ?

  1. publicstaticvoidmain(String[]args)throwsException{
  2. <spanstyle="white-space:pre"></span>//以前的方式:
  3. /*
  4. Useru=newUser();
  5. u.age=12;//set
  6. System.out.println(u.age);//get
  7. */
  8. //获取类
  9. Classc=Class.forName("User");
  10. //获取id属性
  11. FieldidF=c.getDeclaredField("id");
  12. //实例化这个类赋给o
  13. Objecto=c.newInstance();
  14. //打破封装
  15. idF.setAccessible(true);//使用反射机制可以打破封装性,导致了java对象的属性不安全。
  16. //给o对象的id属性赋值"110"
  17. idF.set(o,"110");//set
  18. //get
  19. System.out.println(idF.get(o));
  20. }


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

方法关键字

含义

getDeclaredMethods()

获取所有的方法

getReturnType()

获得方法的放回类型

getParameterTypes()

获得方法的传入参数类型

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

获得特定的方法

构造方法关键字

含义

getDeclaredConstructors()

获取所有的构造方法

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

获取特定的构造方法

父类和父接口

含义

getSuperclass()

获取某类的父类

getInterfaces()

获取某类实现的接口

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

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

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

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

[html] view plain copy print ?

  1. <configuration>
  2. lt;appSettings>
  3. <addkey=""value=""/>
  4. lt;/appSettings>
  5. </configuration>


反射的写法:

[csharp] view plain copy print ?

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


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

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


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




相关文章
|
16天前
|
存储 算法 Java
Java HashSet:底层工作原理与实现机制
本文介绍了Java中HashSet的工作原理,包括其基于HashMap实现的底层机制。通过示例代码展示了HashSet如何添加元素,并解析了add方法的具体过程,包括计算hash值、处理碰撞及扩容机制。
|
6天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
17 5
Java反射机制:解锁代码的无限可能
|
5天前
|
存储 缓存 安全
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
14 3
|
5天前
|
安全 Java UED
深入理解Java中的异常处理机制
【10月更文挑战第25天】在编程世界中,错误和意外是不可避免的。Java作为一种广泛使用的编程语言,其异常处理机制是确保程序健壮性和可靠性的关键。本文通过浅显易懂的语言和实际示例,引导读者了解Java异常处理的基本概念、分类以及如何有效地使用try-catch-finally语句来处理异常情况。我们将从一个简单的例子开始,逐步深入到异常处理的最佳实践,旨在帮助初学者和有经验的开发者更好地掌握这一重要技能。
14 2
|
7天前
|
Java 数据库连接 开发者
Java中的异常处理机制####
本文深入探讨了Java语言中异常处理的核心概念,通过实例解析了try-catch语句的工作原理,并讨论了finally块和throws关键字的使用场景。我们将了解如何在Java程序中有效地管理错误,提高代码的健壮性和可维护性。 ####
|
8天前
|
Java
Java中的反射机制与应用实例
【10月更文挑战第22天】Java作为一门面向对象的编程语言,提供了丰富的特性来支持对象的创建、操作和交互。其中,反射机制是Java的一项核心特性,它允许程序在运行时动态地获取类的信息、创建对象、调用方法、访问属性等。本文将从三个部分探讨Java中的反射机制及其应用实例:一是反射机制的基本概念和原理;二是反射机制在Java中的应用场景;三是通过实例深入理解反射机制的使用方法和技巧。
10 4
|
10天前
|
安全 Java 程序员
深入浅出Java中的异常处理机制
【10月更文挑战第20天】本文将带你一探Java的异常处理世界,通过浅显易懂的语言和生动的比喻,让你在轻松阅读中掌握Java异常处理的核心概念。我们将一起学习如何优雅地处理代码中不可预见的错误,确保程序的健壮性和稳定性。准备好了吗?让我们一起踏上这段旅程吧!
22 6
|
7天前
|
存储 运维 Java
💻Java零基础:深入了解Java内存机制
【10月更文挑战第18天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
21 1
|
10天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
29 5
|
11天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
39 5