Flink链接Kafka

一、基于 Flink 的 Kafka 消息生产者

  • Kafka 生产者的创建与配置
    • 代码通过 FlinkKafkaProducer 创建 Kafka 生产者,用于向 Kafka 主题发送消息。
  • Flink 执行环境的配置
    • 配置了 Flink 的检查点机制,确保消息的可靠性,支持"精确一次"的消息交付语义。
  • 模拟数据源
    • 通过 env.fromElements() 方法创建了简单的消息流,发送了三条消息 "a", "b", 和 "c"
package com.example.kafka_flink.service;

import com.example.kafka_flink.util.MyNoParalleSource;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.CheckpointingMode;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.Properties;
@Service
public class SimpleKafkaProducer {

    public static void main(String[] args) throws Exception {
        // 创建 SimpleKafkaProducer 的实例
        SimpleKafkaProducer kafkaProducer = new SimpleKafkaProducer();
        // 调用 producer 方法
        kafkaProducer.producer();
    }

    public void producer() throws Exception {
        // 设置 Flink 执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 配置检查点机制,设置检查点模式为 "Exactly Once"(精确一次)
        env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);

        // 启用检查点机制,设置检查点时间间隔为 5000 毫秒(5 秒)
        env.enableCheckpointing(5000);

        // 配置 Kafka 属性,包括身份验证信息
        Properties properties = new Properties();
        properties.setProperty("bootstrap.servers", "xxxx");
        properties.setProperty("security.protocol", "SASL_PLAINTEXT");
        properties.setProperty("sasl.mechanism", "SCRAM-SHA-512");
        properties.setProperty("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"xxx\" password=\"xxx\";");

        // 创建 Kafka 生产者实例,并设置目标主题和序列化模式
        FlinkKafkaProducer<String> producer = new FlinkKafkaProducer<>(
                "WJ-TEST",
                // 使用 SimpleStringSchema 进行字符串序列化
                new SimpleStringSchema(),
                properties
        );

        // 模拟数据源,生产一些简单的消息,并将消息写入 Kafka
        env.fromElements("a", "b", "c")
                .addSink(producer);

        // 启动 Flink 作业
        env.execute("Kafka Producer Job");
    }
}

二、基于 Flink 的 Kafka 消息消费者

2.1 消费一个Topic

  • 设置 Flink 执行环境

    • 使用 StreamExecutionEnvironment.getExecutionEnvironment() 创建执行环境。
  • 启用检查点机制

    • 调用 env.enableCheckpointing(5000),设置检查点时间间隔为 5 秒。
    • 配置检查点模式为 EXACTLY_ONCE,确保数据一致性。
  • 配置 Kafka 属性

    • 设置 Kafka 服务器地址(bootstrap.servers)。
    • 指定消费组 ID(group.id)。
    • 配置安全协议和认证机制(SASL_PLAINTEXTSCRAM-SHA-512)。
  • 创建 Kafka 消费者

    • 使用 FlinkKafkaConsumer<String> 指定单个 Kafka Topic(如 "WJ-TEST")。
    • 设置消息反序列化方式为 SimpleStringSchema
    • 配置消费者从最早偏移量开始消费(setStartFromEarliest())。
  • 将 Kafka 消费者添加到 Flink 数据流

    • 调用 env.addSource(consumer) 添加 Kafka 消费者作为数据源。
    • 使用 FlatMapFunction 处理消息,将其打印或进一步处理。
  • 启动 Flink 作业

    • 使用 env.execute("start consumer...") 启动 Flink 作业,开始消费 Kafka 的消息流。
 //消费单个topic
    public static void consumerOneTopic() throws Exception {
        // 设置 Flink 执行环境
        // 创建一个流处理的执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 启用检查点机制,设置检查点的时间间隔为 5000 毫秒(5 秒)
        env.enableCheckpointing(5000);

        // 配置检查点模式为 "Exactly Once"(精确一次)
        env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);

        // 配置 Kafka 属性,包括身份验证信息
        Properties properties = new Properties();
        // 设置 Kafka 集群地址
        properties.setProperty("bootstrap.servers", "xxxx");
        // 设置消费组 ID,用于管理消费偏移量
        properties.setProperty("group.id", "group_test");
        // 设置安全协议为 SASL_PLAINTEXT
        properties.setProperty("security.protocol", "SASL_PLAINTEXT");
        // 设置 SASL 认证机制为 SCRAM-SHA-512
        properties.setProperty("sasl.mechanism", "SCRAM-SHA-512");
        // 配置 SASL 登录模块,包含用户名和密码
        properties.setProperty("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"xxx\" password=\"xxx\";");

        // 创建一个 Kafka 消费者实例
        FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>(
                // 设置要消费的 Kafka 主题名称
                "WJ-TEST",
                // 使用 SimpleStringSchema 将 Kafka 的消息反序列化为字符串
                new SimpleStringSchema(),
                // 传入 Kafka 的配置属性
                properties
        );

        // 设置消费者从 Kafka 的最早偏移量开始消费消息
        consumer.setStartFromEarliest();

        // 将 Kafka 消费者作为数据源添加到 Flink 的执行环境中
        env.addSource(consumer).flatMap(new FlatMapFunction<String, String>() {
            @Override
            
            public void flatMap(String s, Collector<String> collector) throws Exception {
                // 打印消费到的消息内容到控制台
                System.out.println(s);
                // 收集消费到的消息,供后续处理
                collector.collect(s);
            }
        });

        // 启动并执行 Flink 作业,作业名称为 "start consumer..."
        env.execute("start consumer...");
    }

生产消息结果:

2.2 消费多个Topic

  • 设置 Flink 执行环境

    • 使用 StreamExecutionEnvironment.getExecutionEnvironment() 创建执行环境。
  • 启用检查点机制

    • 配置检查点模式为 EXACTLY_ONCE,确保数据一致性。
    • 调用 env.enableCheckpointing(5000) 设置检查点时间间隔为 5 秒。
  • 配置 Kafka 属性

    • 设置 Kafka 服务器地址(bootstrap.servers)。
    • 指定消费组 ID(group.id)。
    • 配置安全协议和认证机制(SASL_PLAINTEXTSCRAM-SHA-512)。
  • 定义 Kafka Topic 列表

    • 创建一个 List<String>,添加多个 Kafka Topic 名称(如 "WJ-TEST""KAFKA_TEST_001")。
  • 创建 Kafka 消费者

    • 使用 FlinkKafkaConsumer,传入 Kafka Topic 列表和自定义反序列化器(CustomDeSerializationSchema)。
    • 配置消费者从最早偏移量开始消费(setStartFromEarliest())。
  • 将 Kafka 消费者添加到 Flink 数据流

    • 调用 env.addSource(consumer) 添加 Kafka 消费者作为数据源。
    • 使用 FlatMapFunction 处理消息,打印消息的 Topic、分区、偏移量、键和值,并收集消息值进行进一步处理。
  • 启动 Flink 作业

    • 使用 env.execute("start consumer...") 启动 Flink 作业,开始消费 Kafka 的多个主题消息流。
//消费多个topic
    public static void consumerTopics() throws Exception {
        // 设置 Flink 执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 配置检查点机制,设置检查点模式为 "Exactly Once"(精确一次)
        env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);

        // 启用检查点机制,设置检查点时间间隔为 5000 毫秒(5 秒)
        env.enableCheckpointing(5000);

        // 配置 Kafka 属性,包括身份验证信息
        Properties properties = new Properties();
        properties.setProperty("bootstrap.servers", "xxxx");

        properties.setProperty("group.id", "group_test");
        properties.setProperty("security.protocol", "SASL_PLAINTEXT");
        properties.setProperty("sasl.mechanism", "SCRAM-SHA-512");
        properties.setProperty("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"xxx\" password=\"xxx\";");

        // 定义需要消费的 Kafka 主题列表
        List<String> topics = new ArrayList<>();
        topics.add("WJ-TEST");
        topics.add("KAFKA_TEST_001");

        // 使用自定义反序列化器创建 Kafka 消费者实例
        FlinkKafkaConsumer<ConsumerRecord<String, String>> consumer = new FlinkKafkaConsumer<>(
                topics,
                new CustomDeSerializationSchema(),
                properties
        );

        // 设置消费者从 Kafka 的最早偏移量开始消费消息
        consumer.setStartFromEarliest();

        // 将 Kafka 消费者作为数据源添加到 Flink 的执行环境中
        env.addSource(consumer).flatMap(new FlatMapFunction<ConsumerRecord<String, String>, Object>() {
            @Override
            public void flatMap(ConsumerRecord<String, String> record, Collector<Object> collector) throws Exception {
                // 打印消费到的消息内容到控制台
                System.out.println("Topic: " + record.topic() +
                        ", Partition: " + record.partition() +
                        ", Offset: " + record.offset() +
                        ", Key: " + record.key() +
                        ", Value: " + record.value());
                // 收集消费到的消息,供后续处理
                collector.collect(record.value());
            }
        });

        // 启动并执行 Flink 作业
        env.execute("start consumer...");
    }

2.3 消费Topic的总体代码

package com.example.kafka_flink.service;

import com.example.kafka_flink.util.CustomDeSerializationSchema;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.CheckpointingMode;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import org.apache.flink.util.Collector;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * @author wangjian
 */
@Service
public class SimpleKafkaConsumer {

    public static void main(String[] args) throws Exception {
//         SimpleKafkaConsumer.consumerOneTopic();
        SimpleKafkaConsumer.consumerTopics();

    }

 //消费单个topic
    public static void consumerOneTopic() throws Exception {
        // 设置 Flink 执行环境
        // 创建一个流处理的执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 启用检查点机制,设置检查点的时间间隔为 5000 毫秒(5 秒)
        env.enableCheckpointing(5000);

        // 配置检查点模式为 "Exactly Once"(精确一次)
        env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);

        // 配置 Kafka 属性,包括身份验证信息
        Properties properties = new Properties();
        // 设置 Kafka 集群地址
        properties.setProperty("bootstrap.servers", "xxxx");
        // 设置消费组 ID,用于管理消费偏移量
        properties.setProperty("group.id", "group_test");
        // 设置安全协议为 SASL_PLAINTEXT
        properties.setProperty("security.protocol", "SASL_PLAINTEXT");
        // 设置 SASL 认证机制为 SCRAM-SHA-512
        properties.setProperty("sasl.mechanism", "SCRAM-SHA-512");
        // 配置 SASL 登录模块,包含用户名和密码
        properties.setProperty("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"xxx\" password=\"xxx\";");

        // 创建一个 Kafka 消费者实例
        FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>(
                // 设置要消费的 Kafka 主题名称
                "WJ-TEST",
                // 使用 SimpleStringSchema 将 Kafka 的消息反序列化为字符串
                new SimpleStringSchema(),
                // 传入 Kafka 的配置属性
                properties
        );

        // 设置消费者从 Kafka 的最早偏移量开始消费消息
        consumer.setStartFromEarliest();

        // 将 Kafka 消费者作为数据源添加到 Flink 的执行环境中
        env.addSource(consumer).flatMap(new FlatMapFunction<String, String>() {
            @Override
            
            public void flatMap(String s, Collector<String> collector) throws Exception {
                // 打印消费到的消息内容到控制台
                System.out.println(s);
                // 收集消费到的消息,供后续处理
                collector.collect(s);
            }
        });

        // 启动并执行 Flink 作业,作业名称为 "start consumer..."
        env.execute("start consumer...");
    }


//消费多个topic
    public static void consumerTopics() throws Exception {
        // 设置 Flink 执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 配置检查点机制,设置检查点模式为 "Exactly Once"(精确一次)
        env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);

        // 启用检查点机制,设置检查点时间间隔为 5000 毫秒(5 秒)
        env.enableCheckpointing(5000);

        // 配置 Kafka 属性,包括身份验证信息
        Properties properties = new Properties();
        properties.setProperty("bootstrap.servers", "xxxx");

        properties.setProperty("group.id", "group_test");
        properties.setProperty("security.protocol", "SASL_PLAINTEXT");
        properties.setProperty("sasl.mechanism", "SCRAM-SHA-512");
        properties.setProperty("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"xxx\" password=\"xxx\";");

        // 定义需要消费的 Kafka 主题列表
        List<String> topics = new ArrayList<>();
        topics.add("WJ-TEST");
        topics.add("KAFKA_TEST_001");

        // 使用自定义反序列化器创建 Kafka 消费者实例
        FlinkKafkaConsumer<ConsumerRecord<String, String>> consumer = new FlinkKafkaConsumer<>(
                topics,
                new CustomDeSerializationSchema(),
                properties
        );

        // 设置消费者从 Kafka 的最早偏移量开始消费消息
        consumer.setStartFromEarliest();

        // 将 Kafka 消费者作为数据源添加到 Flink 的执行环境中
        env.addSource(consumer).flatMap(new FlatMapFunction<ConsumerRecord<String, String>, Object>() {
            @Override
            public void flatMap(ConsumerRecord<String, String> record, Collector<Object> collector) throws Exception {
                // 打印消费到的消息内容到控制台
                System.out.println("Topic: " + record.topic() +
                        ", Partition: " + record.partition() +
                        ", Offset: " + record.offset() +
                        ", Key: " + record.key() +
                        ", Value: " + record.value());
                // 收集消费到的消息,供后续处理
                collector.collect(record.value());
            }
        });

        // 启动并执行 Flink 作业
        env.execute("start consumer...");
    }


}

2.4 自定义的 Kafka 反序列化器 (CustomDeSerializationSchema)

实现了一个自定义的 Kafka 反序列化器 (CustomDeSerializationSchema),主要功能是将从 Kafka 中消费到的消息(字节数组格式)解析为包含更多元数据信息的 ConsumerRecord<String, String> 对象。以下是其作用的具体说明:

  • 解析 Kafka 消息

    • 消息的 keyvalue 由字节数组转换为字符串格式,便于后续业务逻辑处理。
    • 同时保留 Kafka 消息的元数据信息(如主题名称 topic、分区号 partition、偏移量 offset)。
  • 扩展 Flink 的 Kafka 数据处理能力

    • 默认的反序列化器只处理消息内容(keyvalue),而该自定义类将消息的元数据(如 topicpartition)也作为输出的一部分,为复杂业务需求提供了更多上下文信息。
  • 控制流数据的结束逻辑

    • 实现了 isEndOfStream 方法,返回 false,表示 Kafka 的数据流是持续的,Flink 不会主动终止数据消费。
  • 定义 Flink 数据类型

    • 使用 getProducedType 方法,明确告诉 Flink 输出的数据类型是 ConsumerRecord<String, String>,便于 Flink 在运行时正确处理流数据。
package com.example.kafka_flink.util;

import org.apache.flink.api.common.typeinfo.TypeHint;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.streaming.connectors.kafka.KafkaDeserializationSchema;
import org.apache.kafka.clients.consumer.ConsumerRecord;

import java.nio.charset.StandardCharsets;

/**
 * @author wangjian
 */
public class CustomDeSerializationSchema implements KafkaDeserializationSchema<ConsumerRecord<String, String>> {

    // 是否表示流的最后一条元素
    // 返回 false,表示数据流会源源不断地到来,Flink 不会主动停止消费
    @Override
    public boolean isEndOfStream(ConsumerRecord<String, String> stringStringConsumerRecord) {
        return false;
    }

    // 反序列化方法
    // 将 Kafka 消息从字节数组转换为 ConsumerRecord<String, String> 类型的数据
    // 返回的数据不仅包括消息内容(key 和 value),还包括 topic、offset 和 partition 等元数据信息
    @Override
    public ConsumerRecord<String, String> deserialize(ConsumerRecord<byte[], byte[]> consumerRecord) throws Exception {
        // 检查 key 和 value 是否为 null,避免空指针异常
        String key = consumerRecord.key() == null ? null : new String(consumerRecord.key(), StandardCharsets.UTF_8);
        String value = consumerRecord.value() == null ? null : new String(consumerRecord.value(), StandardCharsets.UTF_8);

        // 构造并返回一个 ConsumerRecord 对象,其中包含反序列化后的 key 和 value,以及其他元数据信息
        return new ConsumerRecord<>(
                // Kafka 主题名称
                consumerRecord.topic(),
                // 分区号
                consumerRecord.partition(),
                // 消息偏移量
                consumerRecord.offset(),
                // 消息的 key
                key,
                // 消息的 value
                value
        );
    }

    // 指定数据的输出类型
    // 告诉 Flink 消费的 Kafka 数据类型是 ConsumerRecord<String, String>
    @Override
    public TypeInformation<ConsumerRecord<String, String>> getProducedType() {
        return TypeInformation.of(new TypeHint<ConsumerRecord<String, String>>() {
        });
    }
}

2.5 消费到消息的结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑有两张网卡,如何实现同时访问外网和内网?

要是想让一台电脑用两张网卡&#xff0c;既能访问外网又能访问内网&#xff0c;那可以通过设置网络路由还有网卡的 IP 地址来达成。 检查一下网卡的连接 得保证电脑的两张网卡分别连到外网和内网的网络设备上&#xff0c;像路由器或者交换机啥的。 给网卡配上不一样的 IP 地…

dockerfile2.0

dockerfile实现lnmp nginx centos7 mysql centos7 php centos7 自定义镜像来实现整个架构 cd /opt mkdir nginx mysql php cd nginx 拖入nginx和wordpress vim Dockerfile vim nginx.conf ↓ worker_processes 1; events {worker_connections 1024; } http {include …

mysql-5.7.18保姆级详细安装教程

本文主要讲解如何安装mysql-5.7.18数据库&#xff1a; 将绿色版安装包mysql-5.7.18-winx64解压后目录中内容如下图&#xff0c;该例是安装在D盘根目录。 在mysql安装目录中新建my.ini文件&#xff0c;文件内容及各配置项内容如下图&#xff0c;需要先将配置项【skip-grant-tab…

【深度学习实战】kaggle 自动驾驶的假场景分类

本次分享我在kaggle中参与竞赛的历程&#xff0c;这个版本是我的第一版&#xff0c;使用的是vgg。欢迎大家进行建议和交流。 概述 判断自动驾驶场景是真是假&#xff0c;训练神经网络或使用任何算法来分类驾驶场景的图像是真实的还是虚假的。 图像采用 RGB 格式并以 JPEG 格式…

在Linux上如何让ollama在GPU上运行模型

之前一直在 Mac 上使用 ollama 所以没注意&#xff0c;最近在 Ubuntu 上运行发现一直在 CPU 上跑。我一开始以为是超显存了&#xff0c;因为 Mac 上如果超内存的话&#xff0c;那么就只用 CPU&#xff0c;但是我发现 Llama3.2 3B 只占用 3GB&#xff0c;这远没有超。看了一下命…

学习 Git 的工作原理,而不仅仅是命令

Git 是常用的去中心化源代码存储库。它是由 Linux 创建者 Linus Torvalds 创建的&#xff0c;用于管理 Linux 内核源代码。像 GitHub 这样的整个服务都是基于它的。因此&#xff0c;如果您想在 Linux 世界中进行编程或将 IBM 的 DevOps Services 与 Git 结合使用&#xff0c;那…

【MySQL实战】mysql_exporter+Prometheus+Grafana

要在Prometheus和Grafana中监控MySQL数据库&#xff0c;如下图&#xff1a; 可以使用mysql_exporter。 以下是一些步骤来设置和配置这个监控环境&#xff1a; 1. 安装和配置Prometheus&#xff1a; - 下载和安装Prometheus。 - 在prometheus.yml中配置MySQL通过添加以下内…

适配器模式案例

如果在这样的结构中 我们在Controller中注入&#xff0c;但我们后续需要修改Oss时&#xff0c;比如从minioService改成AliyunService时&#xff0c;需要改动的代码很多。于是我们抽象出一个FileService&#xff0c;让controller只跟fileservice耦合&#xff0c;这样我没只需要在…

AI大模型语音交互方案,ESP32-S3联网通信,设备智能化响应联动

在科技日新月异的当下&#xff0c;人工智能与物联网技术正以前所未有的速度重塑着我们的生活&#xff0c;玩具和潮玩领域也迎来了翻天覆地的变化。 AI语音交互在玩具和潮玩产品中的应用越来越广泛&#xff0c;ESP32-S3凭借其高性能、低功耗、丰富的外设接口和强大的AI能力&…

Android DataBinding 结合 ViewModel的使用

Android DataBinding 结合 ViewModel的使用 一、build.gradle引入对应的依赖 在build.gradle&#xff08;app模块&#xff09;里引入依赖&#xff0c;然后Sync Now一下&#xff1a; android {​viewBinding {enabled true}dataBinding {enabled true}} 完整的build.gradle代…

掌握Golang strings包:高效字符串处理指南

掌握Golang strings包&#xff1a;高效字符串处理指南 引言为什么要学习和掌握strings包本教程的目标 基本用法strings包概述导入strings包常用函数列表及简要介绍 字符串创建与基本操作创建字符串字符串连接&#xff1a;Join重复字符串&#xff1a;Repeat修改字符串&#xff1…

论文阅读:Searching for Fast Demosaicking Algorithms

今天介绍一篇有关去马赛克的工作&#xff0c;去马赛克是 ISP 流程里面非常重要的一个模块&#xff0c;可以说是将多姿多彩的大千世界进行色彩还原的重要一步。这篇工作探索的是如何从各种各样的去马赛克算法中&#xff0c;选择最佳的一种。 Abstract 本文提出了一种方法&…

自建RustDesk服务器

RustDesk服务端 下面的截图是我本地的一个服务器做为演示用&#xff0c;你自行的搭建服务需要该服务器有固定的ip地址 1、通过宝塔面板快速安装 2、点击【安装】后会有一个配置信息&#xff0c;默认即可 3、点击【确认】后会自动安装等待安装完成 4、安装完成后点击【打开…

JavaSE学习心得(反射篇)

反射 前言 获取class对象的三种方式 利用反射获取构造方法 利用反射获取成员变量 利用反射获取成员方法 练习 保存信息 跟配置文件结合动态创建 前言 接上期文章&#xff1a;JavaSE学习心得&#xff08;多线程与网络编程篇&#xff09; 教程链接&#xff1a;黑马…

工业视觉2-相机选型

工业视觉2-相机选型 一、按芯片类型二、按传感器结构特征三、按扫描方式四、按分辨率大小五、按输出信号六、按输出色彩接口类型 这张图片对工业相机的分类方式进行了总结&#xff0c;具体如下&#xff1a; 一、按芯片类型 CCD相机&#xff1a;采用电荷耦合器件&#xff08;CC…

信凯科技业绩波动明显:毛利率远弱行业,资产负债率偏高

《港湾商业观察》施子夫 1月8日&#xff0c;深交所官网显示&#xff0c;浙江信凯科技集团股份有限公司&#xff08;以下简称“信凯科技”&#xff09;主板IPO提交注册。 自2022年递交上市申请&#xff0c;信凯科技的IPO之路已走过两年光景&#xff0c;尽管提交注册&#xff0…

1.15学习

web ctfhub-网站源码 打开环境&#xff0c;查看源代码无任何作用&#xff0c;但是其提醒就在表面暗示我们用dirsearch进行目录扫描&#xff0c;登录kali的root端&#xff0c;利用终端输入dirsearch -u 网址的命令扫描该网址目录&#xff0c;扫描成功后获得信息&#xff0c;在…

Windows部署NVM并下载多版本Node.js的方法(含删除原有Node的方法)

本文介绍在Windows电脑中&#xff0c;下载、部署NVM&#xff08;node.js version management&#xff09;环境&#xff0c;并基于其安装不同版本的Node.js的方法。 在之前的文章Windows系统下载、部署Node.js与npm环境的方法&#xff08;https://blog.csdn.net/zhebushibiaoshi…

Android Studio历史版本包加载不出来,怎么办?

为什么需要下载历史版本呢&#xff1f; 虽然官网推荐使用最新版本&#xff0c;但是最新版本如果自己碰到问题&#xff0c;根本找不到答案&#xff0c;所以博主这里推荐使用历史版本&#xff01;&#xff01;&#xff01; Android Studio历史版本包加载不出来&#xff1f; 下…

一招解决word嵌入图片显示不全问题

大家在word中插入图片的时候有没有遇到过这个问题&#xff0c;明明已经将图片的格式选为“嵌入式”了&#xff0c;但是图片仍然无法完全显示&#xff0c;这个时候直接拖动图片可能会使文字也乱掉&#xff0c;很难精准定位位置。 这个问题是由于行距设置导致的&#xff0c;行距…