您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

帮你理清楚Java反射应该如何写

时间:2019-09-25 09:56:39  来源:  作者:

JAVA反射的概念

百度百科对Java反射的定义:JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

举一个我使用到反射的例子:有一个类,它内部用一个private方法获取到了原始信息,然后在对外public方法中将数据过滤返回。我现在想拿到原始数据,通过普通途径是拿不到的,这时候就可以通过反射实现。

Java反射涉及到4个类和一个接口。四个类是Class类、Field类、Method类、Constructor类(后面三个类都属于Java 反射类库java.lang.reflect),一个接口是Member接口。

  • Class类:实现反射功能是通过下面三个类和一个接口的。那么为什么需要Class类呢?第一,JVM创建对象之前必须加载该类的Class对象。第二,看源码可以发现,下面三个类是没有public构造器的,也就是说下面三个类的对象只能通过Class类来获取。
  • Constructor类:实现了Member接口。该类针对构造器。主要提供创建对象的功能。
  • Field类:实现了Member接口。该类针对属性。该类提供了获取属性的类型、修饰符、注解、变量名、值以及修改属性值的功能(包括private属性)
  • Method类:实现了Member接口。该类针对方法。该类提供了获取方法返回类型、方法参数类型、方法参数名称、方法抛出异常类型、方法修饰符,以及通过反射调用方法等功能。
  • Member接口:该类提供了一个方法AccessibleObject。所以实现类的对象都可以使用该方法取消 Java 语言访问权限检查。

一般使用反射,代码步骤就是:

  1. 获取目标类的Class对象
  2. 通过Class对象获取Field对象或者Method对象或者Constructor对象
  3. 使用Field对象或者Method对象或者Constructor对象调用实现的Member接口的AccessibleObject方法去交访问权限检查
  4. Field对象或者Method对象或者Constructor对象进行反射操作

For Example

有这样一个类,可以看到其构造器、属性和方法都是私有的(toString方法是一会儿用来验证的),普通的手段是无法使用这个类的。

帮你理清楚Java反射应该如何写

目标类

现在通过反射来使用这个类:

帮你理清楚Java反射应该如何写

通过反射操作构造器、方法、属性

最后看一下运行结果:

帮你理清楚Java反射应该如何写

运行结果

接口整理

看了上面的例子应该对Java反射有了整体的理解。但上面的例子仍旧太简单了,因为Java反射还提供了很多其他的接口可供调用。

获取Class对象

上面例子中是一种获取Class对象的方式,获取Class对象的方式有很多种:

帮你理清楚Java反射应该如何写

常见的获取Class对象的方法

Constructor对象

Class提供4种获取Constructor对象的方法。

//获取指定的构造器(任何访问类型的构造器、注意是可变参数)
Class.getDeclaredConstructor(Class<?>... parameterTypes);
//获取指定的public构造器(注意是可变参数)
Class.getConstructor(Class<?>... parameterTypes);
//获取所有构造器(任何访问类型的构造器),返回Constructor数组
Class.getDeclaredConstructors();
//获取所有public构造器,返回Constructor数组
Class.getConstructors();

Field对象

Class提供4种获取Field对象的方法。

和获取Constructor对象类似。

现在再看看上面写的:

Field类:实现了Member接口。该类针对属性。该类提供了获取属性的类型、修饰符、注解、变量名、值以及修改属性值的功能(包括private属性)

例子种修改属性值是通过set方法实现的。其他提到的这些功能,Field都有相应的方法可供调用。只需简单查询接口文档即可。

获取Method对象

Class提供4种获取Method对象的方法。

和获取Constructor对象类似。

Method类:实现了Member接口。该类针对方法。该类提供了获取方法返回类型、方法参数类型、方法参数名称、方法抛出异常类型、方法修饰符,以及通过反射调用方法等功能。

例子中通过反射调用方法使用的是invoke()方法。其他提到的功能,Method都有相应的方法可供调用。只需要简单的查询接口文档即可。



Tags:Java反射   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
什么是反射?在Java中,对于任意一个运行中的对象,可以调用该对象的任意属性和方法;已知一个类,可以获取这个类的所有属性和方法,这就是反射机制。一般情况下,根据面向对象封装原则,J...【详细内容】
2020-10-28  Tags: Java反射  点击:(61)  评论:(0)  加入收藏
Java反射的概念百度百科对Java反射的定义:JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这...【详细内容】
2019-09-25  Tags: Java反射  点击:(128)  评论:(0)  加入收藏
要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运行时识别对象和类的信息,主要有两种方式:一种是传统的RTTI(Run-Time Type Identification),它假定我们在编译时已...【详细内容】
2019-09-10  Tags: Java反射  点击:(116)  评论:(0)  加入收藏
反射机制什么是Java反射就是正在运行,动态获取这个类的所有信息。反射机制的作用1,反编译:.class&ndash;>.java2.通过反射机制访问java对象的属性,方法,构造方法等;反射机制的应用...【详细内容】
2019-07-10  Tags: Java反射  点击:(375)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条