Java反射(自己的理解)

2023-10-26

动态语言:运行是代码可以根据某些条件改变自身结构,像js和php,python等,但是我们不像c++,是一门静态语言,可以准确的说我们是一门准动态语言,因为反射让我们具有动态性。

我来直接用我所理解的反射给大家先讲一下大概(这绝对让你的耳目一新,不会私信过来我报位置你来刀我):

反射:将类的各个组成部分封装为对象,这就是反射所具有的机制

我们从基层聊起:

        写Java代码我们所需要经历三个阶段:

源代码阶段:首先我们会先写一个基础代码,通过javac编译就会在我们的硬盘上生成一个字节码文件(成员变量,构造方法,成员方法等),这个阶段代码还在硬盘没有进内存

Class类阶段:通过类加载器(对应着Java中的对象Classloader)将Java的字节文件加载到内存里面,然而在Java中万物皆对象(所以你也是有对象的)而这个对象便是Class  类对象(用来描述所以的字节码文件)而在这个Class对象也有三部分比较重要的东西:成员变量   封装为 Field[ ]fielids   构造方法封装为 Constructor[ ] con 成员方法封装为 Metod[ ] mets(因为不可能只有一个成员变量(构造方法,成员方法),因此使用数组描述所以成员变量(构造方法,成员方法)),然后就可以去创建其他对象

Runtime运行阶段:就是我们一直所说的new一个对象

现在我们说一下我们将成员变量   封装为 Field 

                                     构造方法封装为 Constructor

                                      成员方法封装为 Metod

这个就是我们所说的反射机制。

        是不是感觉有那么一点思路了,我们继续深究一下便好

 

目录

1.类加载

1.1类加载

类的加载详细过程

什么时候会发生类的初始化

1.2类加载器

2.反射(框架设计的灵魂)

1.1 反射的作用:

1.2 反射的概述

1.3 获取class类的对象:

1.4Class对象的分类

1.4.1反射_获取Constructor构造器对象.

1.4.2 反射_获取Field成员变量对象。

1.4.3 获取Method方法对象

作者最后的挣扎:


 

1.类加载

理解类加载是理解反射最快的方法    

1.1类加载

        当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出现意外情况,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者类初始化

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rW357u1aG9uZw==,size_20,color_FFFFFF,t_70,g_se,x_16

类的加载详细过程

  1. 类的加载:就是把类的class文件读到内存中,并为其创建class对象。(类加载器来完成)
  2. 类的链接:将Java类的二进制数据合并到JVM的运行状态之中的过程。
    • 验证:确保加载的类信息符合JVM规范,没有安全方面的问题。
    • 准备:正式为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配。
    • 解析:JVM常量池内的符号引用(常量名)替换为直接引用(地址)的过程。
  3. 类的初始化:JVM负责对类进行初始化
    • 执行类构造器的<clinit>()方法的过程。
      这个方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的(类构造器是构造类信息的,不是构造该类对象的构造器)
    • 当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。
    • JVM会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步

 

类的初始化步骤
●假如类还未被加载和连接,则程序先加载并连接该类
●假如该类的直接父类还未被初始化, 则先初始化其直接父类
●假如类中有初始化语句, 则系统依次执行这些初始化语句
注意:在执行第2个步骤的时候,系统对直接父类的初始化步骤也遵循初始化步骤1-3

什么时候会发生类的初始化

  1. 类的主动引用(一定会发生类的初始化)

    • 当虚拟机启动,先初始化main方法所在的类。
    • new一个类的对象。
    • 调用类的静态成员(除了final常量)和静态方法。
    • 使用java.lang.reflect包的方法对类进行反射调用。
    • 当初始化一个类,如果其父类没有被初始化,则先会初始化他的父类。
  2. 类的被动引用(不会发生类的初始化)

    • 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化。
    • 通过数组定义类引用,不会触发此类的初始化。
    • 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)。
package 反射;

public class Texy02 {
    public static void main(String[] args) {
        hong h=new hong() ;
        System.out.println(hong.m);}
}
class hong{
    static {
        System.out.println("hong");
        m=300;
    }
    static int m=100;
    public hong(){
        System.out.println("hong1");
    }
    
}

解释原理:(Class对象是在类加载时候产生的)

        先从方法区存放某个类的值,随后放到堆里面的java.lang.Class对象来代表某个类,开始看栈里面的main方法,开始链接并执行代码,new某类的时候会产生某类的对象,对象就会去寻找自己的Class类,并会获得数据

1.2类加载器

1.2.1 类加载器的作用
●负责将.class文件加载到内存中 ,并为之生成对应的java.lang.Class对象
●虽然我们不用过分关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行
1.2.2 JVM的类加载机制
●全盘负责:就是当一一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入
●父类委托:就是当一个类加载器负责加载某个Class时,先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类
●缓存机制: 保证所有加载过的Class都会被缓存,当程序需要使用某个Class对象时, 类载器先从缓存区中搜索该Class,只有当缓存区中不存在该Cass对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存储到缓存区
ClassLoader:负责加载类的对象
1.2.3 Java运行时具有以下内置类加载器
●Bootstrap class loader:它是虚拟机的内置类加载器,通常表示为null ,并且没有父null
●Platformclass loader:平台类加载器可以看到所有平台类,平台类包括由平台类加载器或其祖先定义的Java SE平台API,其实现类和JDK特定的运行时类
●System class loader:它也被称为应用程序类加载器,与平台类加载器不同。系统类加载器通常用于定义应用程序类路径,模块路径和JDK特定工具上的类
●类加载器的继承关系: System的父加载器为Platform, 而Platform的父加载器为Bootstrap
ClassLoader中的两个方法
static Classl oader getSystemClassLoader):返回用于委派的系统类加载器
ClassLoader getParent0:返回父类加载器进行委派

package 反射;

public class Text03 {
        public static void main(String[] args) throws ClassNotFoundException {
            // 获取系统类的加载器
            ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
            System.out.println(systemClassLoader);// 打印:sun.misc.Launcher$AppClassLoader@18b4aac2
            // 获取系统类加载器的父类加载器-->扩展类加载器
            ClassLoader parent = systemClassLoader.getParent();
            System.out.println(parent);// 打印:sun.misc.Launcher$ExtClassLoader@1b6d3586
            // 获取扩展类加载器的父类加载器-->根加载器(C/C++)   根加载器无法直接获取
            ClassLoader parent1 = parent.getParent();
            System.out.println(parent1);// 打印:null
            // 测试当前类是哪个加载器加载的
            ClassLoader classLoader = Class.forName("反射.Text03").getClassLoader();
            System.out.println(classLoader);// 打印:sun.misc.Launcher$AppClassLoader@18b4aac2
            // 测试jdk内部类是哪个加载器加载的。(由根加载器加载的,所以打印不出来,为null)
            ClassLoader classLoader1 = Class.forName("java.lang.Object").getClassLoader();
            System.out.println(classLoader1);// 打印:null
            // 如何获得系统类加载器可以加载的路径
            System.out.println(System.getProperty("java.class.path"));
            // 打印:
        }
    }


 

2.反射(框架设计的灵魂)

1.1 反射的作用:

在java运行环境中,对于任意一个类,可以知道这个类的所有属性和方法,对于任意一个对象,可以调用它的任意属性和方法,这种动态获取类的信息以及动态调用对象方法的功能,就来自于java语言的反射机制。反射是java提供的一个重要功能,可以在运行时检查、类、接口、方法和变量等信息,无需知道类的方法和方法名等,还可以在运行时实例化新对象、调用方法以及设置和获取变量值。

1.2 反射的概述

  • 反射是指对于任何一个Class类,在"运行的时候"都可以直接得到这个类全部成分。
  • 在运行时,可以直接得到这个类的构造器对象:Constructor
  • 在运行时,可以直接得到这个类的成员变量对象:Field
  • 在运行时,可以直接得到这个类的成员方法对象:Method
  • 这种运行时动态获取类信息以及动态调用类中成分的能力称为Java语言的反射机制。
  • watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rW357u1aG9uZw==,size_20,color_FFFFFF,t_70,g_se,x_16
  • watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rW357u1aG9uZw==,size_20,color_FFFFFF,t_70,g_se,x_16

 class类就是所以.class所对应的类型,就是如同上图所表示的音像或者躯体,然后就可以通过class来使用成员变量,构造方法的,就不在使用student和teacher,这个原理就是反射。

1.3 获取class类的对象:

哪些类型可以有Class对象?
➢class: 外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类。
➢interface: 接口
➢[]:数组
➢enum:枚举
➢annotation: 注解@interface
➢primitive type:基本数据类型
➢void

 我们要想通过反射去使用一个类,首先我们要获取该类的字节码文件对象,也就是类型为class类型的对象。

➢Class 本身也是一个类
➢Class 对象只能由系统建立对象
➢一个加载的类在JVM中只会有一个Class实例
➢一个Class对象对应的是一 个加载到JVM中的一个.class文件
➢每个类的实例都会记得自己是由哪个Class实例所生成
➢通过Class可以完整地得到一个类中的所有被加载的结构
➢Class类 是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的
Class对象

反射的第一步是什么?

获取Class类对象,如此才可以解析类的全部成分

获取Class类的对象的三种方式

方式一:Class c1 = Class.forName(“全类名”);

方式二:Class c2 = 类名.class

方式三:Class c3 = 对象.getClass();

 

package 反射;

public class Text01 {
    public static void main(String[] args) throws ClassNotFoundException {
        // 1、Class类中的一个静态方法:forName(全限名:包名 + 类名)
        Class c = Class.forName("反射.Text01");
        System.out.println(c); // Student.class

        // 2、类名.class
        Class c1 = Student.class;
        System.out.println(c1);

        // 3、对象.getClass() 获取对象对应类的Class对象。
        Student s = new Student();
        Class c2 = s.getClass();
        System.out.println(c2);
    }
}
 class Student {
    private String name;
    private int age;

     Student(){
        System.out.println("无参数构造器执行!");
    }

    public Student(String name, int age) {
        System.out.println("有参数构造器执行!");
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

1.4Class对象的分类

1.4.1反射_获取Constructor构造器对象.

反射的第一步是先得到Class类对象。(Class文件)

反射中Class类型获取构造器提供了很多的API:
         1. Constructor getConstructor(Class... parameterTypes)
            根据参数匹配获取某个构造器,只能拿public修饰的构造器,几乎不用!
         2. Constructor getDeclaredConstructor(Class... parameterTypes)
            根据参数匹配获取某个构造器,只要申明就可以定位,不关心权限修饰符,建议使用!
         3. Constructor[] getConstructors()
            获取所有的构造器,只能拿public修饰的构造器。几乎不用!!太弱了!
         4. Constructor[] getDeclaredConstructors()
            获取所有申明的构造器,只要你写我就能拿到,无所谓权限。建议使用!!
    小结:
        获取类的全部构造器对象: Constructor[] getDeclaredConstructors()
            -- 获取所有申明的构造器,只要你写我就能拿到,无所谓权限。建议使用!!
        获取类的某个构造器对象:Constructor getDeclaredConstructor(Class... parameterTypes)
            -- 根据参数匹配获取某个构造器,只要申明就可以定位,不关心权限修饰符,建议使用!
 

package 反射;

import org.junit.Test;

import java.lang.reflect.Constructor;

/**
 目标: 反射_获取Constructor构造器然后通过这个构造器初始化对象。

 反射获取Class中的构造器对象Constructor作用:
 也是初始化并得到类的一个对象返回。

 Constructor的API:
 1. T newInstance(Object... initargs)
 创建对象,注入构造器需要的数据。
 2. void setAccessible(true)
 修改访问权限,true代表暴力攻破权限,false表示保留不可访问权限(暴力反射)
 小结:
 可以通过定位类的构造器对象。
 如果构造器对象没有访问权限可以通过:void setAccessible(true)打开权限
 构造器可以通过T newInstance(Object... initargs)调用自己,传入参数!
 */
public class Test04 {
    // 1.调用构造器得到一个类的对象返回。
    @Test
    public void getDeclaredConstructor() throws Exception {
        // a.第一步:获取类对象
        Class c = Student.class;
        // b.定位单个构造器对象 (按照参数定位无参数构造器)
        Constructor cons = c.getDeclaredConstructor();
        System.out.println(cons.getName() + "===>" + cons.getParameterCount());

        // 如果遇到了私有的构造器,可以暴力反射
        cons.setAccessible(true); // 权限被打开

        Student s = (Student) cons.newInstance();
        System.out.println(s);

        System.out.println("-------------------");

        // c.定位某个有参构造器
        Constructor cons1 = c.getDeclaredConstructor(String.class, int.class);
        System.out.println(cons1.getName() + "===>" + cons1.getParameterCount());

        Student s1 = (Student) cons1.newInstance("孙悟空", 1000);
        System.out.println(s1);
    }


}

1.4.2 反射_获取Field成员变量对象。

     反射的第一步是先得到Class类对象。

     1、Field getField(String name);
            根据成员变量名获得对应Field对象,只能获得public修饰
     2.Field getDeclaredField(String name);
            根据成员变量名获得对应Field对象,只要申明了就可以得到
     3.Field[] getFields();
            获得所有的成员变量对应的Field对象,只能获得public的
     4.Field[] getDeclaredFields();
            获得所有的成员变量对应的Field对象,只要申明了就可以得到
     小结:
        获取全部成员变量:getDeclaredFields
        获取某个成员变量:getDeclaredField

反射获取成员变量: 取值和赋值。

    Field的方法:给成员变量赋值和取值
        void set(Object obj, Object value):给对象注入某个成员变量数据
        Object get(Object obj):获取对象的成员变量的值。
        void setAccessible(true);暴力反射,设置为可以直接访问私有类型的属性。
        Class getType(); 获取属性的类型,返回Class对象。
        String getName(); 获取属性的名称。

1.4.3 获取Method方法对象

    反射获取类的Method方法对象:
         1、Method getMethod(String name,Class...args);
             根据方法名和参数类型获得对应的方法对象,只能获得public的

         2、Method getDeclaredMethod(String name,Class...args);
             根据方法名和参数类型获得对应的方法对象,包括private的

         3、Method[] getMethods();
             获得类中的所有成员方法对象,返回数组,只能获得public修饰的且包含父类的

         4、Method[] getDeclaredMethods();
            获得类中的所有成员方法对象,返回数组,只获得本类申明的方法。

    Method的方法执行:
        Object invoke(Object obj, Object... args)
          参数一:触发的是哪个对象的方法执行。
          参数二: args:调用方法时传递的实际参数

作者最后的挣扎:

现在是不是已经差不多了,要是还没有理解恭喜你,你没有理解的那一块我可能也不会,实力可能有限,可以找找视频或者找一个前辈,在项目中试试就差不多了

 

 

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

Java反射(自己的理解) 的相关文章

  • 静态方法和实例方法的方法参考

    对于 Java 中的实例方法 我无法理解方法引用的概念 例如 在下面的示例中 编译器在列表行中给出错误 我看过 String toUpperCase 的例子 我对这一点感到困惑 1 String是类 toUpperCase是实例方法 Jav
  • 如何在 spring-data-mongodb 框架中将 BigDecimal 转换为 Double

    Spring Data MongoDB 映射默认将 BigDecimal 转换为 String 但是 我希望它们在 mongodb 中转换为 Double 这是后者在 mongodb 中对该字段进行查询 比较查询 聚合查询 所必需的 我如何
  • 如何实现 Spring XD 接收器?

    到目前为止 我已经实现了 Spring XD 处理器 例如像这样 MessageEndpoint public class MyTransformer Transformer inputChannel input outputChannel
  • ArrayList 调整大小

    我有一个 ArrayList 对象 我知道它的确切大小 有什么方法可以指定ArrayList不应该扩展其容量吗 List
  • 如何设置http请求的源IP?

    在发送 http 请求之前 我需要设置源 IP 地址 用于 IP 欺骗等 用于建立http连接的类是HTTPURLConnection 我在 stackoverflow 上找到了下面的链接 这非常有用 注册和使用自定义 java net U
  • android sqlite 一次读取所有行

    有没有办法读取 sqlite 表中的所有行并在文本视图中立即显示它们 这就是我阅读它们的方式 它逐行阅读 retrieves all the titles public Cursor getAllTitles return db query
  • java.io.Console - 类似于与标准输入重定向兼容的实用程序?

    某些 Java 库中是否有实用程序类提供类似的便利设施java io Console http docs oracle com javase 6 docs api java io Console html但与输入的 Bash 管道重定向兼容
  • Hashcode() 与 Equals()

    我有下面这两门课 class Emp implements Comparable String name job public String getName return name public void setName String na
  • 如何实现加密的共享偏好设置

    如何在我的 android java 应用程序中实现加密的共享首选项https developer android google cn reference androidx security crypto EncryptedSharedPr
  • Hibernate 抛出一个预期的 OPEN,发现 '+'

    下面是我的 hql update User set count count 2 where id 1 并且有以下异常详细信息 org hibernate hql internal ast QuerySyntaxException expec
  • 如何在smack中设置我的名字?

    我可以使用 connection getRoster getName 来获取联系人的名册名称 但如何set当前经过身份验证的帐户的名称 使用不同的帐户登录 说真的 你的帐户名与你的身份验证绑定在一起 没有办法强迫对方为你使用特定的昵称 但如
  • URI/URL 和 String 有什么区别?

    这是出于好奇 不需要代码 我尝试使用世界上最好的搜索引擎来获取答案 但没有发现任何有价值的东西 有什么区别URI URL以及表示该 URI URL 的字符串 为什么我们必须解析它 将字符串解析成什么URI URL对字符串进行不同的处理 为什
  • Java 中的生命游戏,人口过剩但不明白为什么

    这是家庭作业 我在底部添加了相关代码 Problem 在试图允许用户调整网格大小时 网格现在被绘制得严重过度填充 截图 人口过剩 https i stack imgur com 0Ilrq png https i stack imgur c
  • AsyncResponse ConnectionCallback 在泽西岛中不会触发

    对于异步编程 Jersey JAX RS 提供了ConnectionCallback当连接断开时要执行的回调 来自泽西岛文档 https jersey java net documentation latest async html d0e
  • Apache Poi:获取 DOC 文档中的页数

    如何使用 Apache Poi 获取 DOC 文档中的页数 我尝试使用以下代码 HWPFDocument wordDoc new HWPFDocument new FileInputStream lowerFilePath Integer
  • 在java中用另一个字符串替换字符串

    什么函数可以将一个字符串替换为另一个字符串 示例 1 什么将取代 HelloBrother with Brother 示例 2 什么将取代 JAVAISBEST with BEST The replace http download ora
  • java与maven和eclipse中的clojure混合

    我创建了一个示例多语言程序 我有一个用java实现的传感器和一个机器人 以及用clojure实现的AI 我无法正确连接maven src main java clojuretest DistanceSensor java AI clj us
  • Spring Hibernate:重新加载实体映射

    在 Web 应用程序中 我们使用 Spring 3 2 和 Hibernate 4 1 1 并实现类似插件的架构 可以在运行时添加和删除插件 对于每个模块 我们定义了一个单独的类加载器 并在 spring 上创建单独的子应用程序上下文 完整
  • GenJar 更换或更新?

    GenJar 是一个专门的 Ant 任务 它基于类依赖关系而不是简单地基于目录的内容构建 jar 文件 http genjar sourceforge net http genjar sourceforge net 确实有用 但是项目好像不
  • 使用 apache poi 读取 .xlsx 文件在 Linux 机器上给出 org.apache.poi.POIXMLException

    我有一个应用程序读取 xlsx 文件并向用户显示内容 该应用程序在 Windows 环境下运行良好 我在 ubuntu 服务器上的 tomcat6 上部署了此 Web 应用程序的 war 文件 我还将 xlsx 文件复制到服务器上 代码中的

随机推荐

  • loadrunner11目标场景

    目标场景 设置一个运行目标 通过Controller的自动加载功能进行自动化负载 如果测试的结果达到目标 说明系统的性能符合测试目标 否则就提示无法达到目标 编辑目标场景 目标类型有5种
  • python-图像边缘化处理

    本文由本人原创 仅作为自己的学习记录 主要利用Sobel 用作边缘检测 它是一离散性差分算子 用来运算图像亮度函数的灰度值 在图像的任何一点使用此算子 将会产生对应的灰度矢量或是其法矢量 Sobel边缘检测通常带有方向性 可以只检测竖直边缘
  • 【Linux0.11 源码历险记 2】《保护模式》

    继续跟着stup s 来看 lidt idt 48 load idt with 0 0 lgdt gdt 48 load gdt with whatever appropriate idt 48 word 0 idt limit 0 wor
  • 【Unity】 2D 游戏 库存模块实现

    库存模块主要参考了 youtube 上的视频 BMo 的 Flexible INVENTORY SYSTEM in Unity with Events and Scriptable Objects 和 Simple Inventory UI
  • DVWA SQL injection

    low 猜测表名 1 union select 1 group concat table name from information schema tables where table schema dvwa 如果出现问题 到MySQL里将
  • Java常用对象API——基本数据类型对象包装类

    基本数据类型对象包装类 为了方便操作基本数据类型值 将其封装成了对象 在对象中定义了属性和行为丰富了该数据的操作 用于描述该对象的类就称为基本数据类型对象包装类 byte Byte short Short int Integer long
  • EXCEL中数据透视表的(空白)如何不显示,并且不影响数据更新

    或许有碰到同样问题的 希望对大家有所帮助 1 数据透视表更新过来的数据显示 空白 不好看 开始将用户做了筛选 将空白的复选框去掉 可以达到效果 但是发现有数据更新时 新的数据不能被同步显示 除非手动去再次筛选用户将除空白外的数据勾选 2 点
  • Ble Mesh的Heatbeat(心跳)&地址&Model(模型)

    心跳 将节点配置为定期发送称为心跳消息的消息 Heartbeat 消息的目的 1 表示该节点仍然处于活动状态 2 允许根据传递 Heartbeat 消息所需的跳数确定其与接收者的距离 Heartbaeat的opcode 和Friend re
  • 主存储器的基本组成

    主存储器的基本组成 存储体 存储体也叫存储矩阵 是由一个个存储0或1的记忆单元 存储元 构成的 为了存取存储体中的信息 必须对存储单元进行编址 编址单位是指具有相同地址的那些存储元件构成的一个单位 常见有按字节编址 寻址访存 CPU首先把被
  • C#集合(泛型集合与非泛型)

    每日一句 自律 努力 方法 坚持 时间 优秀 集合特点 一种数据容器 一种数据结构 容纳多个数据 大小可变 空间不一定连续 命名空间 非泛型集合 System Collections 非泛型集合 System Collections Gen
  • 动态博客系统

    Halo 是我折腾过的众多博客系统里面 最好 最容易上手的动态博客系统之一 solo 也是 轻快 简洁 功能强大 正文 上周末正在募集团队一起写算法题 群里讨论需要一个网站来存放文章 恰巧我有一个已经备案但闲置的域名 马上开干 之前的网站是
  • 解惑React之this.setState({ [name]: value })

    react之this setState name value 疑问 学习React中文官方文档中的非空组件与受控组件中 遇到如下代码 class Reservation extends React Component constructor
  • 【面试系列】重排链表

    题意 原题链接 思路 快慢指针找到中点 或者先遍历得到长度 再遍历一半也可行 反转后半部分 归并两部分 代码 Definition for singly linked list struct ListNode int val ListNod
  • Excel 解析,通过Excel的地址和MultipartFile进行解析

    目录 两种方法都用到了read 和getValue 方法对数据进行解析 只是二者传入的Excel数据格式不一样 第一种方法 通过Excel地址进行解析Excel的数据 第二种方法 解析Excel的MultipartFile数据流获取数据 H
  • mmocr 训练字符检测模型

    目录 1 数据集 2 config文件配置 3 测试模型 1 数据集 这里以icdar2015字符检测为例https blog csdn net jizhidexiaoming article details 124149164 spm 1
  • Visio 2007/2010 左侧"形状"窗口管理

    Visio 2007 2010 左侧 形状 窗口管理 Visio 打开后 通常窗口左侧会有一个 形状 面板 我们可以方便地从中选择需要的形状 有时为了获得更大的版面空间或者不小心关闭了形状面板 怎么把它重新调出来 我们可以从 视图 中把它找
  • 使用docker快速搭建服务器环境

    思路 将nginx mysql tomcat等环境打包为一个个docker 然后使用docker compose管理 服务器内安装docker相关环境 然后直接运行docker compose配置 即可快速搭建完成服务器环境 之后可以将相关
  • Markdown / KaTex数学公式汇总

    目录 LaTex和KaTex 软件推荐 Mathpix 一 如何插入公式 二 上下标 三 常用运算符 四 高级运算符 五 常用数学符号 六 特殊符号 6 1 箭头 6 2 公式序号 七 括号使用 八 矩阵 九 集合运算 十 希腊字母 十一
  • 使用反射实现动态修改@Excel的注解属性

    业务场景 我们使用poi实现数据导出时 通常是根据 Excel name xxx 来确定列名 通常情况下这个是不会发生变动的 但这里就说少数情况 在我们需要这里根据某些情况来进行改变的时候 我们就需要用到反射 AirQualityRanki
  • Java反射(自己的理解)

    动态语言 运行是代码可以根据某些条件改变自身结构 像js和php python等 但是我们不像c 是一门静态语言 可以准确的说我们是一门准动态语言 因为反射让我们具有动态性 我来直接用我所理解的反射给大家先讲一下大概 这绝对让你的耳目一新