【JAVA】JAVA 反射

时间:2021-08-14 19:40:27
在Java反射机制中,需要掌握的知识有:
        (1)掌握反射机制的概述。
        (2)能够使用Class类并结合java.lang.reflect包取得一个类的完整结构。
        (3)能够使用反射机制实例化对象、动态地调用类中的指定方法和设置属性值。
 
反射机制的概述
 
        运行时类型信息(RTTI)使得可以在程序运行时发现和使用类型信息。在Java中的RTTI形式包括三种:
        (1)传统的类型转换。由RTTI确保类型转换的正确性,如果执行了一个错误的类型转换,就会抛出一个ClassCastException异常。
        (2)使用关键字instanceof。它返回布尔值,告诉我们一个对象是不是某个特定类型的实例。
        (3)通过反射机制,查询Class对象获取运行时所需的信息。
        类加载的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段,其中验证、准备和解析三个部份统称为链接。
        在加载阶段,Java堆中生成一个代表一个类的java.lang.Class对象,该对象记录了该类所有的结构信息,作为方法区这些数据的访问入口。
        在初始化阶段,虚拟机规范则是严格规定了有且只有四种情况必须立即对类进行初始化:
        (1)遇到new、getstatic、putstatic或invokestatic这四条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这四条指令的最常见的Java代码场景是:使用new关键字实例化对象的时候、读取或设置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候、以及调用一个类的静态方法的时候。
        (2)使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
        (3)当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
        (4)当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先初始化这个主类。
 
实例化Class类对象
 
        Class类是反射的源头,该类可以通过3种方式实例化。(1)通过Class类的静态方法Class.forName实例化。(2)通过Object对象的getClass()方法实例化,返回此 Object 的运行时类Class。(3)使用类字面常量实例化Class对象(类名.class),但是它不会自动地初始化该Class对象,因此类中的静态域没有初始化。
  
static Class<?>
forName(String className) 
          返回与带有给定字符串名的类或接口相关联的 Class 对象。
static Class<?>
forName(String name, boolean initialize, ClassLoader loader) 
          使用给定的类加载器及是否必须初始化类,返回与带有给定字符串名的类或接口相关联的 Class 对象。
 
取得类的结构信息
 
     通过以上三种方式获取到了Class类,此时我们就可以使用Class类获取类的结构信息,常用方法如下:
int
 getModifiers() 
          返回此类或接口以整数编码的 Java 语言修饰符,使用Modifier.toString(int modify)进行转换。
boolean
isEnum() 
         当且仅当该类声明为源代码中的枚举时返回 true。
boolean
isInterface()
         判定指定的 Class 对象是否表示一个接口类型。
String
getName()
          以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
String
getSimpleName() 
          返回源代码中给出的底层类的简称。
String
getCanonicalName() 
          返回 Java Language Specification 中所定义的底层类的规范化名称。
Class<? super T> 
getSuperclass() 
          返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
Class<?>[]
getInterfaces()
          确定此对象所表示的类或接口实现的接口。
Constructor<?>[] getConstructors()
          返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。 
Constructor<?>[] getDeclaredConstructors() 
          返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
Constructor<T> getConstructor(Class<?>... parameterTypes)
          返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
          返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
Method[] getMethods()
          返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
Method[] getDeclaredMethods() 
          返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
Method getMethod(String name, Class<?>... parameterTypes) 
          返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
Method getDeclaredMethod(String name, Class<?>... parameterTypes) 
          返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
Field[] getFields()
          返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
Field[] getDeclaredFields() 
        返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
Field getField(String name) 
          返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field getDeclaredField(String name) 
          返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
T newInstance() 
          创建此 Class 对象所表示的类的一个新实例。
        
使用Class类可以获取到类的构造方法(Constructor)、方法(Method)和字段属性(Field)。我们就可以实现以下三种操作:
           (1)通过Constructor获取构造方法的修饰符、名称、参数类型、抛的异常信息及通过构造方法实例化对象。
           (2)通过Method获取方法的修饰符、返回值类型、方法名、参数类型、抛的异常信息及动态调用指定方法。
           (3)通过Field获取属性的修饰符、类型、 名称及动态设置属性值。
 
 Constructor常用方法
int
getModifiers()
          以整数形式返回此 Constructor 对象所表示构造方法的 Java 语言修饰符。
String
getName() 
          以字符串形式返回此构造方法的名称。 
Class<?>[]
getParameterTypes() 
          按照声明顺序返回一组 Class 对象,这些对象表示此 Constructor 对象所表示构造方法的形参类型。 
Class<?>[]
getExceptionTypes() 
          返回一组表示声明要抛出的异常类型的 Class 对象,这些异常是由此 Constructor 对象表示的底层构造方法抛出的。 
T
newInstance(Object... initargs)
          使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
 
Method常用方法
int
getModifiers() 
          以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符。
Class<?>
getReturnType() 
          返回一个 Class 对象,该对象描述了此 Method 对象所表示的方法的正式返回类型。 
 String
getName()
          以 String 形式返回此 Method 对象表示的方法名称。 
Class<?>[] 
getParameterTypes() 
          按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。
Object
invoke(Object obj, Object... args)
          对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
 
Field常用方法
int
getModifiers()
          以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符。
Class<?>
getType() 
          返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。 
void 
set(Object obj, Object value)
          将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
 
Object
get(Object obj) 
          返回指定对象上此 Field 表示的字段的值。 
 

【JAVA】JAVA 反射的更多相关文章

  1. JAVA的反射理解

    1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...

  2. java的反射

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

  3. iOS运行时编程&lpar;Runtime Programming&rpar;和Java的反射机制对比

    运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下:   1.相同点   都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...

  4. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  5. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  6. Java:反射

    初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...

  7. Java中反射机制和Class&period;forName、实例对象&period;class&lpar;属性&rpar;、实例对象getClass&lpar;&rpar;的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  8. java笔记--反射进阶之总结与详解

    一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...

  9. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  10. Java中反射的三种常用方式

    Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...

随机推荐

  1. ABP教程-通过ABPboilerplate模版创建项目

    开篇说明: 此篇博客是属于半教程博客,为什么说是半教程呢.因为我不会打算说什么理论性的东西,没必要.要看理论性的资料以及基础信息,请前往tkb至简和@阳光铭睿的博客查看文档资料. 开发环境: vs20 ...

  2. Nova相关命令收集

    1. nova list 2. sudo nova-manage service list 8. 创建/删除浮动IP池 nova floating-ip-bulk-create 192.168.0.2 ...

  3. cat 命令(转)

    cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件] ...

  4. 关于OC语法的公开和私有的讨论

    关于OC语法的公开和私有的讨论 OC语法中,类的.h文件向外面暴露类的功能/方法接口,其中定义的属性/方法/协议/类别/类扩展都属于公开的,但实例变量要看限定词(@protected/@public/ ...

  5. 【转载】HBase 数据库检索性能优化策略

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-HBase/index.html 高性能 HBase 数据库 本文首先介绍了 HBase 数据库基本 ...

  6. 基于Dubbo的压测调优实例

    不久前参与开发了一个基于dubbo分布式框架的底层账单系统,并实现了其中的一部分业务接口,目前需对这些接口进行压测,以评估生产环境所能承受的最大吞吐量.笔者以其中一个查询接口为例来回顾此次压测的整体流 ...

  7. &lpar;折扣计算&rpar;需求说明:普通顾客购物满100元打9折;会员购物打8折;会员购物满200元打7&period;5折(判断语句if-else和switch语句的嵌套结

    package com.summer.cn; import java.util.Scanner; /** * @author Summer *折扣计算 需求说明:普通顾客购物满100元打9折:会员购物 ...

  8. 「SPOJ6340」「BZOJ1939」ZUMA - ZUMA【记忆化搜索】

    题目链接 [洛谷传送门] 题解 \(f[i][j][k]\)表示在消除了\((i,j)\),在后面加上了\(k\)个珠子的总的珠子数. 考虑三种决策:(题目给出的\(k\)在下文表示成\(K\)) 决 ...

  9. UVA136 Ugly Numbers【set】【优先队列】

    丑数 丑数是指不能被2,3,5以外的其他素数整除的数.把丑数从小到大排列起来,结果如下: 1,2,3,4,5,6,8,9,10,12,15,… 求第1500个丑数. 提示:从小到大生成各个丑数.最小的 ...

  10. 对负载均衡的理解及nginx负载均衡的配置

    https://blog.csdn.net/qq_28602957/article/details/61615876