【JAVA-Day23】Java反射的五大神奇妙用,令人惊叹

news2024/11/25 19:29:51

Java反射的五大神奇妙用,令人惊叹

  • Java反射的五大神奇妙用,令人惊叹
    • 摘要
    • 引言
    • 一、什么是反射?
    • 一、什么是反射?
      • 1.1 为什么需要反射?
        • 1.1.1 动态加载类
        • 1.1.2 序列化和反序列化
        • 1.1.3 框架和库开发
      • 1.2 反射基础
    • 二、类
      • 2.1 类完整路径
      • 2.2 包路径
      • 2.3 类名
      • 2.4 获取父类
      • 2.5 获取接口
      • 2.6 根据class创建对象
    • 三、属性
      • 3.1 获取单个属性
      • 3.2 获取全部属性
    • 四、方法
      • 4.1 获取类中单个方法
      • 4.2 获取类所有方法
      • 4.3 调用方法
    • 五、构造器
      • 5.1 获取所有构造器
      • 5.2 获取单个构造器
      • 5.3 使用构造器实例化对象
    • 六、注解
      • 6.1 获取类的注解
      • 6.2 获取字段的所有注解
      • 6.3 获取字段的单个注解
    • 七、完整代码
    • 八、总结
    • 参考资料

在这里插入图片描述
在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻
《java 面试题大全》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨


Java反射的五大神奇妙用,令人惊叹

摘要

在本篇博客中,我将以默语博主身份,以深入研究和扩展的方式,探讨Java反射的五大神奇妙用,这些应用令人惊叹。我们将详细讨论反射的概念,如何操作类、属性、方法、构造器以及注解,最后提供完整的示例代码供您参考。

引言

Java反射是一项强大的技术,它允许我们在运行时检查和操作类的信息,而无需在编译时明确知道这些信息。本文将介绍如何使用Java反射来完成五个令人惊叹的任务,包括获取类的属性和方法、实例化对象、操作构造器以及处理注解。

一、什么是反射?

在Java中,反射是一种允许程序在运行时检查和操作类、方法、字段等信息的能力。反射可以让您动态地获取类的结构和行为,而不需要在编译时明确知道这些信息。

一、什么是反射?

在Java编程中,反射是一项令人惊叹的技术,它赋予了我们在运行时探查、分析和操作类、方法、字段以及注解等元数据信息的能力。这意味着我们可以在程序运行时动态地获取和利用这些信息,而无需在编译时了解它们的存在。反射的能力为我们打开了通往Java程序内部机制的大门,让我们能够以一种非常灵活和强大的方式与代码进行互动。

1.1 为什么需要反射?

反射的使用场景多种多样,下面我们将深入研究几个令人惊叹的用例来展示其重要性:

1.1.1 动态加载类

通过反射,我们可以在运行时动态加载类,这对于插件化架构和扩展性架构非常有用。例如,您可以创建一个插件系统,允许用户在不停止应用程序的情况下添加新功能模块。

String className = "com.example.MyPlugin";
Class<?> pluginClass = Class.forName(className);

1.1.2 序列化和反序列化

反射在Java的序列化和反序列化过程中发挥了关键作用。它允许我们将对象转换为字节流并从字节流重新构建对象,这在网络通信和持久性存储中非常有用。

1.1.3 框架和库开发

许多Java框架和库,如Spring和Hibernate,广泛使用了反射来实现依赖注入、ORM(对象关系映射)和其他高级功能。通过反射,这些框架能够在运行时自动配置和管理组件。

1.2 反射基础

要开始使用反射,首先需要了解以下关键概念:

  • Class类:java.lang.Class是Java反射的核心。它代表了一个类的元数据信息,包括类的名称、字段、方法等。我们可以使用Class对象来获取有关类的各种信息。
Class<?> myClass = MyObject.class;
  • 获取类的实例:通过Class对象,我们可以创建类的实例,这称为实例化。这对于动态创建对象非常有用。
Class<?> myClass = MyObject.class;
MyObject obj = (MyObject) myClass.getDeclaredConstructor().newInstance();

这仅仅是反射的冰山一角。接下来,我们将深入探讨如何操作类、属性、方法、构造器以及注解,以展示反射的更多神奇妙用。

二、类

2.1 类完整路径

在Java中,每个类都有一个完整的路径,反射允许我们获取这个路径。这对于动态加载类和模块化编程非常有用,特别是在大型应用程序中。以下是获取类完整路径的示例代码:

Class<?> myClass = MyObject.class;
String classFullPath = myClass.getName();
System.out.println("类的完整路径:" + classFullPath);

2.2 包路径

了解如何获取类的包路径对于管理类的组织结构非常重要。反射可以帮助我们轻松获取类的包路径,如下所示:

Class<?> myClass = MyObject.class;
Package classPackage = myClass.getPackage();
String packagePath = classPackage.getName();
System.out.println("类的包路径:" + packagePath);

2.3 类名

获取类的名称是反射的基本操作,它通常是我们使用反射时的起点。以下是获取类名的示例代码:

Class<?> myClass = MyObject.class;
String className = myClass.getSimpleName();
System.out.println("类的名称:" + className);

2.4 获取父类

通过反射,我们可以轻松地获取一个类的父类信息。这对于了解类的继承结构非常有用,如下所示:

Class<?> myClass = MyObject.class;
Class<?> superClass = myClass.getSuperclass();
System.out.println("父类的名称:" + superClass.getSimpleName());

2.5 获取接口

了解如何获取类实现的接口列表可以帮助我们更好地理解类的行为和功能。以下是获取类接口信息的示例代码:

Class<?> myClass = MyObject.class;
Class<?>[] interfaces = myClass.getInterfaces();
System.out.println("实现的接口:");
for (Class<?> intf : interfaces) {
    System.out.println(intf.getSimpleName());
}

2.6 根据class创建对象

反射不仅仅是关于类的信息获取,还可以通过类的信息创建对象。这对于在运行时动态地实例化对象非常有用。以下是创建对象的示例代码:

Class<?> myClass = MyObject.class;
try {
    MyObject obj = (MyObject) myClass.getDeclaredConstructor().newInstance();
    System.out.println("创建的对象:" + obj);
} catch (Exception e) {
    e.printStackTrace();
}

这些示例代码展示了如何使用反射来获取类的信息、包路径、类名、父类、实现的接口以及如何使用类信息来动态创建对象。反射为Java程序提供了强大的灵活性,让我们能够在运行时操作类的元数据和对象。在接下来的部分,我们将继续探讨反射的其他用途,包括属性、方法、构造器和注解。

三、属性

3.1 获取单个属性

使用反射,我们可以获取类中的单个属性的信息,包括名称、类型和修饰符。以下是获取单个属性信息的示例代码:

Class<?> myClass = MyObject.class;
try {
    Field field = myClass.getDeclaredField("propertyName");
    String fieldName = field.getName();
    Class<?> fieldType = field.getType();
    int modifiers = field.getModifiers();
    String modifiersStr = Modifier.toString(modifiers);

    System.out.println("属性名称:" + fieldName);
    System.out.println("属性类型:" + fieldType.getSimpleName());
    System.out.println("属性修饰符:" + modifiersStr);
} catch (NoSuchFieldException e) {
    e.printStackTrace();
}

3.2 获取全部属性

了解如何获取类的所有属性,以及如何遍历它们,对于动态配置和数据绑定非常重要。以下是获取所有属性信息并遍历它们的示例代码:

Class<?> myClass = MyObject.class;
Field[] fields = myClass.getDeclaredFields();
System.out.println("类的属性列表:");
for (Field field : fields) {
    String fieldName = field.getName();
    Class<?> fieldType = field.getType();
    int modifiers = field.getModifiers();
    String modifiersStr = Modifier.toString(modifiers);

    System.out.println("属性名称:" + fieldName);
    System.out.println("属性类型:" + fieldType.getSimpleName());
    System.out.println("属性修饰符:" + modifiersStr);
}

四、方法

反射也允许我们获取类中的方法信息,包括方法名称、参数、返回类型和修饰符。下面是关于方法的深入研究和示例代码:

4.1 获取类中单个方法

反射允许我们获取类中的单个方法的信息,包括名称、参数和返回类型。以下是获取单个方法信息的示例代码:

Class<?> myClass = MyObject.class;
try {
    Method method = myClass.getDeclaredMethod("methodName", parameterTypes);
    String methodName = method.getName();
    Class<?> returnType = method.getReturnType();
    int modifiers = method.getModifiers();
    String modifiersStr = Modifier.toString(modifiers);

    System.out.println("方法名称:" + methodName);
    System.out.println("返回类型:" + returnType.getSimpleName());
    System.out.println("方法修饰符:" + modifiersStr);
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

4.2 获取类所有方法

了解如何获取类的所有方法,可以帮助我们实现高级功能,如动态调用。以下是获取所有方法信息的示例代码:

Class<?> myClass = MyObject.class;
Method[] methods = myClass.getDeclaredMethods();
System.out.println("类的方法列表:");
for (Method method : methods) {
    String methodName = method.getName();
    Class<?> returnType = method.getReturnType();
    int modifiers = method.getModifiers();
    String modifiersStr = Modifier.toString(modifiers);

    System.out.println("方法名称:" + methodName);
    System.out.println("返回类型:" + returnType.getSimpleName());
    System.out.println("方法修饰符:" + modifiersStr);
}

4.3 调用方法

通过反射,我们可以在运行时调用类的方法,这对于插件化架构和动态代理非常有用。以下是调用方法的示例代码:

Class<?> myClass = MyObject.class;
try {
    Method method = myClass.getDeclaredMethod("methodName", parameterTypes);
    Object instance = myClass.getDeclaredConstructor().newInstance();
    Object result = method.invoke(instance, methodArguments);
    System.out.println("方法调用结果:" + result);
} catch (Exception e) {
    e.printStackTrace();
}

这些示例代码展示了如何使用反射来获取类的方法信息,包括获取单个方法、获取所有方法以及在运行时调用方法。反射的灵活性使我们能够动态地操作类的行为和实现高级功能。接下来,我们将探讨如何处理构造器和注解,并提供相关示例代码。

五、构造器

5.1 获取所有构造器

了解如何获取类的所有构造器,以及如何使用它们来实例化对象,是反射的重要一部分。以下是获取所有构造器信息的示例代码:

Class<?> myClass = MyObject.class;
Constructor<?>[] constructors = myClass.getDeclaredConstructors();
System.out.println("类的构造器列表:");
for (Constructor<?> constructor : constructors) {
    String constructorName = constructor.getName();
    int modifiers = constructor.getModifiers();
    String modifiersStr = Modifier.toString(modifiers);
    Class<?>[] parameterTypes = constructor.getParameterTypes();

    System.out.println("构造器名称:" + constructorName);
    System.out.println("构造器修饰符:" + modifiersStr);

    System.out.println("构造器参数:");
    for (Class<?> paramType : parameterTypes) {
        System.out.println(paramType.getSimpleName());
    }
}

5.2 获取单个构造器

通过反射,我们可以获取类的单个构造器,并了解它的参数信息。以下是获取单个构造器信息的示例代码:

Class<?> myClass = MyObject.class;
try {
    Constructor<?> constructor = myClass.getDeclaredConstructor(parameterTypes);
    String constructorName = constructor.getName();
    int modifiers = constructor.getModifiers();
    String modifiersStr = Modifier.toString(modifiers);
    Class<?>[] parameterTypes = constructor.getParameterTypes();

    System.out.println("构造器名称:" + constructorName);
    System.out.println("构造器修饰符:" + modifiersStr);

    System.out.println("构造器参数:");
    for (Class<?> paramType : parameterTypes) {
        System.out.println(paramType.getSimpleName());
    }
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

5.3 使用构造器实例化对象

反射使我们能够在运行时使用构造器来创建对象,这对于工厂模式和依赖注入非常有用。以下是使用构造器实例化对象的示例代码:

Class<?> myClass = MyObject.class;
try {
    Constructor<?> constructor = myClass.getDeclaredConstructor(parameterTypes);
    Object[] constructorArgs = { arg1, arg2, ... }; // 构造器参数值
    Object instance = constructor.newInstance(constructorArgs);
    System.out.println("创建的对象:" + instance);
} catch (Exception e) {
    e.printStackTrace();
}

这些示例代码展示了如何使用反射来获取类的构造器信息,包括获取所有构造器、获取单个构造器以及如何使用构造器来实例化对象。反射为我们提供了在运行时动态创建对象的能力,这对于实现灵活的对象创建模式非常有用。接下来,我们将深入研究注解并提供相关示例代码。

六、注解

6.1 获取类的注解

反射可以帮助我们获取类的注解信息,这对于自定义注解和元编程非常重要。以下是获取类的注解信息的示例代码:

Class<?> myClass = MyObject.class;
Annotation[] annotations = myClass.getDeclaredAnnotations();
System.out.println("类的注解列表:");
for (Annotation annotation : annotations) {
    String annotationName = annotation.annotationType().getSimpleName();
    System.out.println("注解名称:" + annotationName);
}

6.2 获取字段的所有注解

了解如何获取类字段的所有注解,可以帮助我们在编写自定义框架和库时使用。以下是获取字段的所有注解信息的示例代码:

Class<?> myClass = MyObject.class;
Field[] fields = myClass.getDeclaredFields();
System.out.println("类字段的注解列表:");
for (Field field : fields) {
    Annotation[] annotations = field.getDeclaredAnnotations();
    System.out.println("字段:" + field.getName() + " 的注解列表:");
    for (Annotation annotation : annotations) {
        String annotationName = annotation.annotationType().getSimpleName();
        System.out.println("注解名称:" + annotationName);
    }
}

6.3 获取字段的单个注解

使用反射,我们可以获取类字段上的特定注解,以实现更精细的控制和配置。以下是获取字段的单个注解信息的示例代码:

Class<?> myClass = MyObject.class;
try {
    Field field = myClass.getDeclaredField("fieldName");
    MyAnnotation annotation = field.getAnnotation(MyAnnotation.class);
    if (annotation != null) {
        String annotationValue = annotation.value();
        System.out.println("字段的注解值:" + annotationValue);
    }
} catch (NoSuchFieldException e) {
    e.printStackTrace();
}

这些示例代码展示了如何使用反射来获取类的注解信息,包括获取类的注解、获取字段的所有注解以及获取字段的特定注解。反射使我们能够在运行时检查和操作注解,这对于实现自定义注解和元编程非常有用。接下来,我们将提供完整的示例代码,并总结这篇技术博客。

七、完整代码

本文提供了完整的示例代码,演示了反射的各种应用,您可以在实际项目中使用这些代码作为参考。

import java.lang.annotation.*;
import java.lang.reflect.*;

// 自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface MyAnnotation {
    String value() default "";
}

// 示例类
class MyObject {
    private String name;
    private int age;

    public MyObject() {
    }

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

    @MyAnnotation("FieldAnnotation")
    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;
    }

    public void printInfo() {
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

public class ReflectionExample {
    public static void main(String[] args) {
        // 获取类信息
        Class<?> myClass = MyObject.class;
        System.out.println("类的完整路径:" + myClass.getName());
        System.out.println("类的包路径:" + myClass.getPackage().getName());
        System.out.println("类的名称:" + myClass.getSimpleName());

        // 获取类属性
        Field[] fields = myClass.getDeclaredFields();
        System.out.println("类的属性列表:");
        for (Field field : fields) {
            System.out.println("属性名称:" + field.getName());
        }

        // 获取类方法
        Method[] methods = myClass.getDeclaredMethods();
        System.out.println("类的方法列表:");
        for (Method method : methods) {
            System.out.println("方法名称:" + method.getName());
        }

        // 获取构造器
        Constructor<?>[] constructors = myClass.getDeclaredConstructors();
        System.out.println("类的构造器列表:");
        for (Constructor<?> constructor : constructors) {
            System.out.println("构造器名称:" + constructor.getName());
        }

        // 获取注解
        try {
            Field annotatedField = myClass.getDeclaredField("name");
            MyAnnotation annotation = annotatedField.getAnnotation(MyAnnotation.class);
            if (annotation != null) {
                String annotationValue = annotation.value();
                System.out.println("字段的注解值:" + annotationValue);
            }
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}

这段示例代码演示了如何使用反射获取类的信息、属性、方法、构造器和注解。

八、总结

Java反射是一个强大的工具,它为我们提供了在运行时操作类、属性、方法、构造器和注解的能力。通过本文的深入研究和扩展,我们探讨了反射的五大神奇妙用,展示了其在实际开发中的广泛应用。希望本文能够帮助您更好地理解和利用Java反射技术。

参考资料

  • Java反射:Class 类
  • Java反射:Field 类
  • Java反射:Method 类
  • Java反射:Constructor 类
  • Java反射:Annotation 类

这些参考资料可以帮助进一步学习和探索Java反射的各个方面。

在这里插入图片描述


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1023989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

乐鑫科技全球首批支持蓝牙 Mesh Protocol 1.1 协议

乐鑫科技 (688018.SH) 非常高兴地宣布&#xff0c;其自研的蓝牙 Mesh 协议栈 ESP-BLE-MESH 现已支持最新蓝牙 Mesh Protocol 1.1 协议的全部功能&#xff0c;成为全球首批在蓝牙技术联盟 (Bluetooth SIG) 正式发布该协议之前支持该更新的公司之一。这意味着乐鑫在低功耗蓝牙无线…

vue 封装element公共组件 +后端联调

首先封装的是一个分页&#xff0c;也是项目组封装公共组件最多之一 1-1创建一个新的页面放分页功能 <template><div><el-pagination size-change"handleSizeChange" current-change"handleCurrentChange" :current-page"currentPage…

掷骰子的多线程应用程序2基于互斥量的线程同步(复现《Qt C++6.0》)

说明&#xff1a;在复现过程中出现两点问题&#xff08;1&#xff09;run()函数中对m_diceValued的赋值&#xff08;2&#xff09;do_timeOut()函数中没有对m_seq、m_diceValued进行定义。修改后的复现程序如下所示&#xff1a; 主线程&#xff1a; .h #pragma once#include…

python excel复制数据保留单元格格式(.xls.xlsx)

最近帮朋友开发一个数据excel根据条件动态过率的功能.读取生成用pandas很方便,但是这里有一点比较麻烦的是得保留原来的单元格格式.这点操作起来就要麻烦一点了.下面总结了.xlsx和.xls处理 1.xlsx 文件处理 xlsx文件处理可以使用openpyxl库进行处理,比较简单,流程如下 1.获取…

接入网络技术

接入网络&#xff1a;是实现网络边缘的端系统与网络核心连接与接入的网络。 常见有以下几类&#xff1a; 1、电话拨号接入&#xff1a;这类接入方式在早期接入网络中主要用于家庭接入&#xff0c;利用了电话网络覆盖广泛的优点&#xff0c;能够方便地实现分散的家庭用户接入网…

指针笔试题讲解(让指针变得简单易懂)

数组名的理解 : 数组名就是首元素地址 但是有两个例外&#xff1a; 1. sizeof&#xff08;数组名&#xff09;这里的数组名表示整个数组的大小&#xff0c;sizeof&#xff08;数组名&#xff09;计算的是整个数组的大小&#xff0c;单位是字节 2. &数组名 这里的数组…

MouseBoost 3.2.3 Pro右键助手 for Mac

MouseBoost Mac 右键助手是一款专为 Mac 平台开发的鼠标增强工具&#xff0c; 其主要特点如下&#xff1a; 1. 可自定义菜单&#xff1a;MouseBoost Mac 右键助手允许用户自定义右键菜单&#xff0c;可以添加或删除菜单项&#xff0c;以适应不同用户的需求。 2. 多种快捷操作&a…

蓝桥杯 题库 简单 每日十题 day5

01 字符计数 #include<stdio.h> int main() { char c; int i,j0,k0; while((cgetchar())!\n){if(ca||ce||ci||cu||co)j;else k;} printf("%d\n%d",j,k); return 0; }02 棋盘 #include<iostream> using namespace std; const int N 2010; int n,m; int …

C++const关键字

本文旨在讲解C中相关const关键字的详解&#xff0c;希望读完本篇文章&#xff0c;可以让诸位对C中的const关键字有更深一步的认识&#xff01; 在C中&#xff0c;若想让类中某一个变量不再改变&#xff0c;可以使用const关键字进行修饰&#xff0c;让数据不被修改&#xff0c;使…

【AI视野·今日Robot 机器人论文速览 第三十六期】Tue, 19 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 19 Sep 2023 (showing first 100 of 112 entries) Totally 112 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers General In-Hand Object Rotation with Vision and Touch Authors Haozhi Qi, Brent Yi…

element-ui问题合集(el-input-number加减一次就失效,el-select同时收集id与name)

el-select同时收集id与name 将id与name拼接成字符串&#xff0c;赋值给value&#xff0c;在使用时&#xff0c;获取value后&#xff0c;再使用split()方法进行分割 <el-select><el-option v-for"item in selectAttr" :label"item.name" :value&…

【深度学习-第3篇】使用MATLAB快速实现CNN分类(模式识别)任务,含一维、二维、三维数据演示案例

在本文中&#xff0c;我们将介绍如何使用 MATLAB 中的 Convolutional Neural Network&#xff08;CNN&#xff09;进行分类任务。我们将使用 MATLAB 的 Deep Learning Toolbox 来创建、训练和评估 CNN。 一、一个简单的案例 1 安装和准备 首先&#xff0c;确保已安装 MATLAB…

chat-gpt笔记:参数temperature与top_p

temperature 官方文档 temperature number or null Optional Defaults to 1 What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. We…

Apache Hive 入门

目录 一、Apache Hive概述 1.1 什么是Hive ​1.2 为什么使用 Hive 1.3 Hive 和 Hadoop 关系 二、场景设计&#xff1a;如何模拟实现Hive功能 2.1 如何模拟实现 Apache Hive 的功能 2.2 映射信息记录 2.3 SQL 语法解析、编译 2.4 最终效果 ​三、Apache Hive 架…

【链表】K 个一组翻转链表-力扣 25 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

【前端知识】Three 学习日志(九)—— 阵列立方体和相机适配体验

Three 学习日志&#xff08;九&#xff09;—— 阵列立方体和相机适配体验 一、双层for循环创建阵列模型 //创建一个长方体几何对象Geometry const geometry new THREE.BoxGeometry(100, 100, 100); //材质对象Material const material new THREE.MeshLambertMaterial({col…

卷运维不如卷网络安全

最近发现很多从事运维的选择了辞职&#xff0c;重新规划自己的职业发展方向。运维工程师这个岗位在IT行业里面确实是处于最底层的&#xff0c;不管什么环节出现问题&#xff0c;基本都是运维背锅。背锅也就罢了&#xff0c;薪资水平也比不上别的岗位。 一般运维的薪资水平大多数…

【Spark】win10配置IDEA、saprk、hadoop和scala

终于&#xff0c;要对并行计算下手了哈哈哈。 一直讲大数据大数据&#xff0c;我单次数据处理量大概在1t上下&#xff0c;是过亿级的轨迹数据。 用python调用multiprogress编写的代码&#xff0c;用多线程也要一个多月跑完。 我对这个效率不太满意&#xff0c;希望能快一点再快…

Mac cocoapod 3分钟安装教程( 国内镜像源方法)

参考链接&#xff1a;2023最新总结&#xff0c;Mac下使用Homebrew完全指南&#xff01; - 知乎 1.打开终端&#xff0c; 执行&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 2.运行&#xff0c;可以选择清…

十、性能测试之数据库测试

性能测试之数据库测试 一、 数据库分类二、 mysql安装及密码的修改1、安装&#xff1a;数据库的版本 mysql5.7版方法1&#xff1a;直接安装方法2&#xff1a;使用rpm包安装方法3&#xff1a;docker方式安装 2、修改数据库的密码3、创建库4、创建表 三、存储引擎1、InnoDB特点 2…