内容引用自:https://www.cnblogs.com/wkrbky/p/6201098.html

https://www.cnblogs.com/xumBlog/p/8882489.html,本篇只为自我回顾学习。

定义:

程序在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取信息和调用对象方法的功能称之为反射机制。

优缺点:

优点就是可以实现动态创建对象和编译(在运行时创建和编译),体现出很大的灵活性。

缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于直接执行相同的操作。

反射机制就是专门 帮我们做那些重复的有规则的事情

在反射中,使用一个类并不需要导入类的所在包,只要知道类的完整路径就可以知道该类中的所有信息。

反射不需要有明确的类型对象,所有的对象都使用Object表示。可以直接用Object的与反射机制的混合调用类中的方法。

使用反射的步骤:

  1.获取想要操作的类的Class对象;

2. 调用Class类中的方法;

3.使用反射API来操作这些信息。

获取Class对象的方法:

1.调用某个对象的getClass()方法;

2.调用某个类的class属性来获取该类对应的Class对象;

3.使用Class类中的forName()静态方法。

在程序开发过程中,使用第二种方法比较多。但是在程序框架设计中,都是使用第三种方法,也就是反射机制用到的方法。

创建对象:

  • 使用Class对象的newInstance()方法来创建该Class对象对应类的实例,但是这种方法要求该Class对象对应的类有默认的空构造器。
  • 先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建 Class对象对应类的实例,通过这种方法可以选定构造方法创建实例

构造函数:

 Constructor getConstructor(Class[] params) 所有的构造函数加参数类型指定具体的构造函数

Constructor[] getConstructors() 所有的构造函数(包含父类的)

Constructor getDeclaredConstructor(Class[] params) 自己定义的构造函数加参数类型指定具体的构造函数

Constructor[] getDeclaredConstructors() 自己定义的构造函数

如果要实例化一个对象,使用无参构造方法比有参构造方法简单的多,使用无参直接调用newInstance()方法,使用有参则先获取有参构造方法,

再通过Constructor中的newInstance()方法,并用指定的初始化参数初始化改实例。很多框架中的底层代码默认都是使用无参构造方法来实例化对象

所以在简单Java类开发中都要明确给出无参构造方法

方法:

获取类中的方法可以分为两大类,每个大类中又可以分为两小类,风别是:

获取包括父类集成而来的方法:

获取全部方法:public Method[] getMethods()  throws SecurityException

获取指定方法:public Method getMethod(String name,Class<?>... parameterTypes)  throws NoSuchMethodException, SecurityException

获取本类中定义的方法:

获取全部方法:public Method[] getDeclaredMethods()  throws SecurityException

获取指定方法:  public Method getDeclaredMethod(String name, Class<?>... parameterTypes)  throws NoSuchMethodException, SecurityException

getModifiers():以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符。

getReturnType():返回一个 Class 对象,该对象描述了此Method 对象所表示的方法的正式返回类型。

getName():以 String 形式返回此 Method 对象表示的方法名称。

getParameterTypes():按照声明顺序返回 Class 对象的数组,这些对象描述了此Method 对象所表示的方法的形参类型。

getExceptionTypes():返回 Class 对象的数组,这些对象描述了声明将此Method 对象表示的底层方法抛出的异常类型。

调用(invoke):对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。

public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException

该方法的英文名字是invoke,中文名称就叫“调用”,该方法在Method类中,Method类本身就代表一个方法,当Method类中的对象调用invoke方法时,

就相当于调用了Method对象所代表的方法,方法里面传入对应的参数,实现动态调用方法。(不是很懂)

属性:

获取包括继承而来的属性:

获取全部属性:public Field[] getFields()  throws SecurityException

获取指定属性:public Field getField(String name)  throws NoSuchFieldException,  SecurityException

获取本类定义的属性:

获取全部属性:public Field[] getDeclaredFields()  throws SecurityException

获取指定的属性:public Field getDeclaredField(String name)  throws NoSuchFieldException,  SecurityException

在Field类中定义了进行属性调用的方法:

设置属性内容:public void set(Object obj, Object value)  throws IllegalArgumentException, IllegalAccessException

获取属性类容:public Object get(Object obj)  throws IllegalArgumentException, IllegalAccessException

利用反射获取类中的属性,是不提倡使用的,因为违背了面向对象的封装特性。

在Construction,Method,Field三个类中有一个共同的父类AccessibleObject,定义了取消封装的操作:setAccessible(Boolean flag)

public void setAccessible(boolean flag)  throws SecurityException

该方法默认的是参数是false,表示反射的对象应该实施 Java 语言访问检查。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。

java反射机制学习笔记的更多相关文章

  1. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  2. JAVA反射机制—学习总结

    最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...

  3. Java反射机制——学习总结

    前几天上REST课,因为涉及到Java的反射机制,之前看过一直没有用过,有些遗忘了,周末找了些资料来重新学习,现在总结一下,加深印象. 什么是反射机制? 参考百度百科对java反射机制的定义: “JA ...

  4. Java反射机制学习与研究

    Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...

  5. Java反射机制学习

    Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答 ...

  6. java反射机制(笔记)

    java反射机制就是获取出class的相应方法 例如 获取构造函数: 模版: Class test = Class.forName("cn.test.Person");//得到相应 ...

  7. Java SPI机制学习笔记

    最近在阅读框架源代码时,常常看到 SPI 的子包, 忍不住查了下: Service Provider Interface : 服务提供接口. JavaSPI 实际上是“基于接口的编程+策略模式+配置文 ...

  8. JAVA反射机制学习随笔

    JAVA反射机制是用于在运行时动态的获取类的信息或者方法,属性,也可以用来动态的生成类,由于所有类都是CLASS的子类,我们可以用一个CLASS类的实例来实例化各种类 例如: Class<?&g ...

  9. Java:反射机制学习笔记

    目录 一.反射机制 1.概述 2.优缺点 3.类加载的过程 二.获取Class对象的三种方式 1.Class.forName("全类名") 2.类名.class 3.对象.getC ...

随机推荐

  1. 字符串格式化-String类format方法

    常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象. format()方法有两种重载形式. 显示不同转换符实现不同数据类型到字符串的转换,如图所示: 测 ...

  2. GitLab项目管理实践

    群组 / 项目 群组和项目的关系我们可以简单的理解成文件夹和文件的关系.一个群组可以包含一个或多个项目. 使用群组,可以将相关的项目组合在一起,并允许成员同时访问多个项目. 群组也可以嵌套在子组中,建 ...

  3. Python在VSCode环境抓取TuShare数据存入MongoDB环境搭建

    本文出自:https://www.cnblogs.com/2186009311CFF/p/11573094.html 总览 此文分为5个部分 第一:Anaconda(下载和安装) 第二:VSCode( ...

  4. Flink SQL 如何实现数据流的 Join?

    无论在 OLAP 还是 OLTP 领域,Join 都是业务常会涉及到且优化规则比较复杂的 SQL 语句.对于离线计算而言,经过数据库领域多年的积累,Join 语义以及实现已经十分成熟,然而对于近年来刚 ...

  5. tp5商城

    记录几个要点: 用户使用firbug伪造表单字段,比如伪造表单id字段,如何防止,tp5中好像没有. xss攻击:使用htmlspecialchars() 会把img.p.等等合法标签过滤掉,想要有选 ...

  6. Java多线程和并发(六),yield函数和中断线程

    目录 1.yield函数 2.中断线程 六.yield函数和中断线程 1.yield函数 2.中断线程 (1)已经被抛弃的方法 (2)目前使用的方法

  7. python中oepen及fileobject初步整理之划水篇

    open选项 参考官方文档,很多东西也没有看懂,将自己理解的部分先整理到这里,以后还是要参阅官方文档的. open (file, mode='r', buffering=-1, encoding=No ...

  8. linux中的selinux到底是什么

    一文彻底明白linux中的selinux到底是什么 2018年06月29日 14:17:30 yanjun821126 阅读数 58877 标签: SElinux 更多 个人分类: Linux   一 ...

  9. create-react-app 构建的项目使用 css module 方式来书写 css

    先 yarn eject 释放出来配置文件具体参见我之前写过相关的文章(这里不再重复), 找到 config 文件夹下的文件如下图所示: 找到如图所示的配置: 书写 css 的文件名例如(App.mo ...

  10. java 手机号/身份证(*)加密隐藏中间某几位几位

    //手机号 保留前3 后4 String phone = "18771632488"; System.out.println(phone.replaceAll("(\\d ...