java反射(从认识到应用)-黑马笔记

2023-10-31

*此文章是观看黑马雷哥关于Java反射的视频做的笔记,如有错请多指教。

一、认识反射

反射在JavaAPI中的详解:

说白了,反射就是:加载类,并允许以编程方式解剖类中的各种成分(成员变量、方法、构造器等)。

如图:

二、反射还学什么?

  1. 加载类、获取类的字节码:class对象

获取class对象的三种方法:

//获取class的三种方法
package com.comple;

public class demo {
    public static void main(String[] args) {
        //第一种方式获取Class对象  
        Class c1 = Student.class;
        System.out.println(c1.getName());//获得全类名:com.comple.Student
        System.out.println(c1.getSimpleName());//获得简名:Student(类名)
        
        //第二种方式获取Class对象
        Class c2=Class.forname("com.comple.Student");

        
        //第三种方式获取Class对象
        Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
        Class c3 = stu1.getClass();//获取Class对象
      

2.获取类中的构造器

demo类:

package com.comple;

public class demo {
    private String name;
    private int age;

    public demo() {
    }

    public demo(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "demo{name = " + name + ", age = " + age + "}";
    }
}

Class 提供的从类中获取构造器的方法:

Test类:

package com.comple;

import org.apache.tomcat.util.bcel.Const;

import java.lang.reflect.Constructor;

public class demoTest {
    public static void main(String[] args) {
        //1.反射第一步先获取类的class对象
        Class c=demo.class;
        //2.获取类的全部构造器
        Constructor[] constructors=c.getConstructors();
        /*
        创建一个构造器类型的数组来接受类中的所有构造器
         */
        //3.遍历数组中的每一个构造器
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName()+"--->"
            +constructor.getParameterCount());
            /*
             获取构造器的名字和构造器的参数个数
             */
        }
    }
}

运行结果:

    public demo() {
    }

    public demo(String name, int age) {
        this.name = name;
        this.age = age;
    }

即得到这个无参构造和有参构造的名字和参数个数

***getConstructors()只能拿到public修饰的构造器,建议使用getDeclaredConstructors();

***getConstructor(参数类型)获取单个构造器,需要写参数类型来定位构造器

eg:

        //获取无参构造器
        Constructor constructor1 = c.getDeclaredConstructor();
        //获取有参构造器
        Constructor constructor2 = c.getDeclaredConstructor(String.class, int.class);
        System.out.println(constructor2.getName() + "--->"
                + constructor2.getParameterCount());

运行结果:

补充:

获取类构造器的作用:依然是初始化对象返回。

//得到class对象
Class c=demo.class;
//获取无参构造器
Constructor constructor = c.getDeclaredConstructor();
//如果构造器私有化,进行暴力反射
constructor.setAccessible(true);
//调用此构造器
demo s=(demo)constructor.newInstance();
System.out.println(s);

输出结果:

3.获取类的成员变量

Field[] fields=c.getDeclaredFields();//获取类的全部成员变量
Field fname=c.getDeclaredField("name");//获取特定的成员变量

获取成员变量的作用:

4.获取类的成员方法

反射的作用:

(1)基本作用:得到一个类的全部成分并操作

(2)破坏封装性

(3)最重要是:适合做Java的框架,基本上主流框架都会基于反射设计出一些通用的功能

*目前反射就学习了这些,如学到新的内容还会再补充。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java反射(从认识到应用)-黑马笔记 的相关文章

随机推荐

  • u盘魔术师给服务器装系统,U盘魔术师怎么装系统 U盘魔术师USM制作PE启动盘方法...

    U盘魔术师是一个很好用的装系统的工具 并且可以利用USM制作PE启动盘 很多用户都不太了解具体的方法 其实也非常的简单 下面小编就来给大家介绍一下U盘魔术师怎么装系统 赶紧来看看吧 U盘魔术师怎么装系统 U盘魔术师体积较大1G多如果是小水管
  • MyBatis学习笔记

    MyBatis MyBatis Mapper代理开发 MyBatis是一款优秀的持久层框架 用于简化JDBC MyBatis 持久层 负责把数据保存到数据库的那一层 JavaEE三层架构 表现层 页面展示 业务层 逻辑处理 持久层 对数据持
  • 在外SSH远程连接macOS服务器【cpolar内网穿透】

    文章目录 前言 1 macOS打开远程登录 2 局域网内测试ssh远程 3 公网ssh远程连接macOS 3 1 macOS安装配置cpolar 3 2 获取ssh隧道公网地址 3 3 测试公网ssh远程连接macOS 4 配置公网固定TC
  • 状态机的置位与复位

    1 状态机的异步置位与复位 异步置位与复位是与时钟无关的 当异步置位与复位到来时它们立即分别置触发器的输出为1或0 不需要等到时钟沿到来才置位或复位 把它们列入always块的事件控制括号内就能触发always块的执行 因此 当它们到来时就
  • Linux设置所有用户环境变量

    Linux中每个用户都要指定各自的环境变量 这样会比较麻烦 那么如何配置一个环境变量 所有的用户都可以使用呢 比如说我想把Linux默认语言由en US UTF 8修改为zh CN UTF 8 那么我需要设置环境变量 LANG 百度很多方法
  • Conda 配置 Python 环境

    文章目录 前言 一 Conda 是什么 二 如何获取 三 使用 Conda 命令配置多环境 1 创建新环境 2 激活新环境 3 配置新环境 4 退出新环境 5 检查所有环境 6 检查所有安装的包 7 删除某环境 8 重命名某环境 四 使用
  • Crontab配置任务定时执行

    一 每奇数周的周一执行 16 0 1 date W 2 eq 1 gt dev null sh data1 test sh 具体地 1 分钟字段 Minute field 16 2 小时字段 Hour field 0 3 日期字段 Day
  • 亚马逊首席技术官Werner Vogels:2023年及未来五大技术趋势预测

    近年来 随着我们经历的数次全球危机 如何借助技术解决人类棘手问题至关重要 如今 我们获取数据的来源比以往任何时候都多 包括可穿戴设备 医疗设备 环境传感器 视频捕获和其他联网设备 当这些数据与计算机视觉 机器学习和模拟仿真等云技术相结合时
  • OpenWrt目录之target

    target目录下主要是和平台有关的代码 最主要的是linux文件夹 linux文件夹的ramips中 ramips应该指的是对应cpu的架构 ramips文件夹下的就是不同系列的cpu对应的芯片的型号 进行试验一下 首先在根目录下运行ma
  • IDEA工具实用开发快捷键

    选中new ArrayList lt gt 或者光标放在new前面 按ctrl alt v 选中new ArrayList lt gt 或者光标放在new后边面 按ctrl alt 空格 ideal 工具没识别maven项目的话 右键pom
  • uni-app开发微信小程序,button通过数组的length判断disabled无效(数组length === 0写法无效)

    错误写法
  • caffe特征提取/C++数据格式转换

    Caffe生成的数据分为2种格式 Lmdb 和 Leveldb 它们都是键 值对 Key Value Pair 嵌入式数据库管理系统编程库 虽然lmdb的内存消耗是leveldb的1 1倍 但是lmdb的速度比leveldb快10 至15
  • 国产操作系统进入被彻底抛弃的时代

    当倪光南正在不断呼喊支持国产操作系统的时候 国产操作系统却迎来了噩梦 国产操作系统接连倒闭 国产操作系统进入一个被国家彻底抛弃的时代 红旗linux梦断国产操作系统 今年2月中科红旗linux因为缺钱倒闭解散了 一直以来做得最好的国产操作系
  • 图形学数学基础之基本蒙特卡罗尔积分(Monte Carlo Integration)

    作者 i dovelemon 日期 2017 07 29 来源 CSDN 主题 Monte Carlo Integration 引言 好久没有写博客了 最近一直在忙于工作 同时GLB库中关于PBR的渲染算法 一直卡住 无法实现下去 不过在这
  • dd大牛的《背包九讲》

    P01 01背包问题 题目 有N件物品和一个容量为V的背包 第i件物品的费用是c i 价值是w i 求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量 且价值总和最大 基本思路 这是最基础的背包问题 特点是 每种物品仅有一件 可以选
  • 【HCNP路由交换学习指南】学习笔记丨第07章 BGP

    07 BGP BGP 的基本概念 BGP 对等体关系类型 IBGP 水平分割原则 路由黑洞问题及 BGP 同步规则 路由通告 Router ID 报文类型及格式 Open 报文 Update 报文 Keepalive 报文 Notifica
  • PaddleOCR使用笔记之模型训练

    目录 简介 模型训练 步骤一 文本检测模型 detection 1 准备训练数据集 2 下载预训练模型 模型介绍 下载预训练模型 3 开始训练 断点训练 4 模型评估 5 模型测试 6 训练模型转inference模型 步骤二 文本识别模型
  • RabbitMQ保证消息的一致性解决方案

    RabbitMQ保证消息的一致性 一 采用confirm消息确认机制及return返回机制 确保消息发送成功 二 将队列以及消息设置持久化 保证rabbitmq突然宕机消息仍然存在 三 手动确认接收消息方式 消息处理失败拒收重回队列 1 y
  • 后端响应是否成功、信息、操作码响应前端及异常处理

    异常处理流程 1 自定义异常类型 2 自定义错误代码及错误信息 3 对于可预知的异常由程序员在代码中主动抛出 由SpringMVC统一捕获 可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型 由于是程序员抛出的异常 通常异常信息比较
  • java反射(从认识到应用)-黑马笔记

    此文章是观看黑马雷哥关于Java反射的视频做的笔记 如有错请多指教 一 认识反射 反射在JavaAPI中的详解 说白了 反射就是 加载类 并允许以编程方式解剖类中的各种成分 成员变量 方法 构造器等 如图 二 反射还学什么 加载类 获取类的