Chiriri's blog Chiriri's blog
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)

Iekr

苦逼后端开发
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)
  • JavaSE

    • Java简介
    • 基础语法
    • 数据类型
    • 变量
    • 运算符
    • 输入输出
    • 流程控制
    • 循环语句
    • idea中的辅助键
    • 数组
    • 方法
    • 面向对象基础
    • 字符串
    • ArrayList集合
    • 继承
    • 修饰符
    • 多态
    • 抽象
    • 接口
    • 类名作为形参和返回值
    • 内部类
    • Api
    • 异常
    • 集合
    • 泛型
    • Set集合和比较器
    • 树
    • 哈希
    • 可变参数
    • 创建不可变的集合
    • Stream流
    • 方法引用
    • File
    • 多线程
    • 多线程高级
    • 网络编程
    • 类加载器
    • 反射
      • 获取class类的对象
        • Class.forName()
        • 类名.class
        • 对象.getclass()
      • 获取Constructor对象
        • getConstructors()
        • getDeclaredConstructors()
        • getConstructor()
        • getDeclaredConstructor()
      • newInstance() 创建对象
        • 被parivate修饰的情况
      • 获取反射的成员变量
        • 赋值
      • 获取成员方法
        • 使用反射后方法
    • XML
    • 枚举
    • 注解
    • 单元测试
    • 日志
    • HTTP协议
    • Servlet
    • 请求对象
    • 响应对象
    • Cookie
    • Session
    • JSP
    • Listener
    • JDBC
  • JavaEE

  • Linux

  • MySQL

  • NoSQL

  • Python

  • Python模块

  • 机器学习

  • 设计模式

  • 传智健康

  • 畅购商城

  • 博客项目

  • JVM

  • JUC

  • Golang

  • Kubernetes

  • 硅谷课堂

  • C

  • 源码

  • 神领物流

  • RocketMQ

  • 短链平台

  • 后端
  • JavaSE
Iekr
2021-07-28
目录

反射

# 反射

利用反射我们可以使用任意一个类中的,所有方法和属性,无视修饰符

用反射创建对象,反射调用成员变量 / 方法

利用反射可以无视修饰符获取类里面所有的属性和方法

先获取配置文件中的信息,动态获取信息并创建对象和调用方法

# 获取 class 类的对象

# Class.forName()

Class<?> aClass = Class.forName("笔记.反射.Studen");
System.out.println(aClass);
1
2

通过 forName 传递全类名 (包名 + 类名) 获取

# 类名.class

Class<Studen> studenClass = Studen.class;
System.out.println(studenClass);
1
2

# 对象.getclass ()

Studen s =new Studen();
Class<? extends Studen> aClass1 = s.getClass();
System.out.println(aClass1);
1
2
3

# 获取 Constructor 对象

Constructor 为构造方法对象,在反射中所有方法属性都为对象

# getConstructors()

该方法获取该 class 所有的公共构造方法

Class<?> aClass = Class.forName("笔记.反射.Studen");
// 获取该class所有的公共构造方法
Constructor<?>[] constructors = aClass.getConstructors();
for (Constructor<?> constructor : constructors) {
    System.out.println(constructor);
}
1
2
3
4
5
6

# getDeclaredConstructors()

返回所有的构造方法,无视修饰符

Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
    System.out.println(declaredConstructor);
}
1
2
3
4

# getConstructor()

返回指定的公共构造方法,必须要与类中的构造方法形参一致,否则无法找到指定构造方法,并抛出异常

Constructor<?> constructor = aClass.getConstructor(String.class,int.class);
System.out.println(constructor);
1
2

# getDeclaredConstructor()

返回单个指定构造方法 无视修饰符

# newInstance () 创建对象

获取到构造方法后我们可以使用 newInstance () 来创建对象 该方法返回一个对象 默认为 object 类型,需要强转为类的类型

Studen zhangsan = (Studen) declaredConstructor.newInstance("zhangsan", 23);
System.out.println(zhangsan);
1
2

如果构造方法为空参 我们可以直接在获取 class 后 的 class 对象直接 newInstance (), 该方法已经过时,不推荐使用

# 被 parivate 修饰的情况

如果该反射对象不是公共修饰符,则创建对象时会发生异常,需要临时取消访问检查

  • setAccessible (boolean); 临时取消访问检查 暴力反射

  • // 获取class类
    Class<?> aClass1 = Class.forName("笔记.反射.Studen");
    
    // 获取所有构造方法
    Constructor<?> declaredConstructor1 = aClass1.getDeclaredConstructor(String.class);
    
    // 临时取消访问检查
    declaredConstructor1.setAccessible(true);
    
    // 创建对象 并 强转成Studen类
    Studen lisi = (Studen) declaredConstructor1.newInstance("lisi");
    
    System.out.println(lisi);
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

# 获取反射的成员变量

  • getFields (); 返回所有公共的成员变量对象的数组

  • getDeclaredFields (): 返回所有成员变量的数组 无视修饰符

  • getField (String name); 指定成员变量名字 返回单个公共成员变量对象

  • getDeclaredField (String name): 返回单个公共成员变量对象 无视修饰符

  • Class<?> aClass1 = Class.forName("笔记.反射.Studen");
    
    
    Field[] fields = aClass1.getFields();
    for (Field field : fields) {
        System.out.println(field);
    }
    
    Field age = aClass1.getDeclaredField("age");
            System.out.println(age);
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

注意 获取的成员变量必须真实存在 否则会报错 并且注意修饰符

# 赋值

  • set (object obj,object value): 赋值

  • get (object obj): 获取值

  • Field w = aClass1.getField("w");
    
    w.set(lisi,123);
    System.out.println(w.get(lisi));
    
    1
    2
    3
    4

注意:

  1. 对象参数传递 newinstance () 方法创建的对象

  2. 如果为私有属性 必须临时取消访问检查 setAccessible (boolean) 先获取 field 对象再取消检查

# 获取成员方法

  • getMethods (): 返回所有公共成员方法对象的数组,包括继承的

  • getDeclaredMethods (): 返回所有的成员方法对象的数组,不包括继承的方法

  • getMethod(String name,Class <?> ... parmeterTypres): 返回指定名称的公共成员方法 Class 为形参 必须传递类型的 class 对象

  • geDeclaredtMethod(String name,Class <?> ... parmeterTypres): 返回指定名称的成员方法

  • Method setName = aClass1.getMethod("setName", String.class);
    System.out.println(setName);
    
    1
    2

# 使用反射后方法

  • invoke (object obj,object args): 运行指定方法

    • 参数一:用 obj 对象调用该方法 newinstance 出来的对象
    • 参数二:调用方法的传递参数 (可省)
  • Method setName = aClass1.getMethod("setName", String.class);
    
    Studen lisi = (Studen) declaredConstructor1.newInstance("lisi");
    
    setName.invoke(lisi,"haha");
    
    1
    2
    3
    4
    5
编辑 (opens new window)
上次更新: 2023/12/06, 01:31:48
类加载器
XML

← 类加载器 XML→

最近更新
01
k8s
06-06
02
进程与线程
03-04
03
计算机操作系统概述
02-26
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Iekr | Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式