java字典注入与关联注入

一、注解类

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataFill {}
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DictBind {String code(); //字典分類編碼String[] kvs();//kvs={"a:A","b:B"}  //a為本類屬性 A為字典屬性或者目標類屬性
}

实体关联注入

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldBind {String beanName();String methodName();String[] kvs();//kvs={"a:A","b:B"}  //a為本類屬性 A為字典屬性或者目標類屬性}

二、注解拦截器

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import com.anyec.base.converter.DataConverter;@Component
@Aspect
public class DataFillAspect {private static final Logger log = LoggerFactory.getLogger(DataFillAspect.class);@Pointcut(value="@annotation(com.anyec.base.annotation.DataFill)")public void dataPointCut() {}@AfterReturning(pointcut = "dataPointCut()",returning = "value")public Object dataFill(JoinPoint joinPoint,Object value) throws Exception{return DataConverter.convert(value);}}

三、注解的实现


import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;import com.anyec.base.annotation.DictBind;
import com.anyec.base.annotation.FieldBind;
import com.anyec.base.model.Dict;
import com.anyec.base.model.RT;
import com.anyec.base.utils.SpringUtils;
import com.baomidou.mybatisplus.core.metadata.IPage;public class DataConverter {private static final Logger log = LoggerFactory.getLogger(DataConverter.class);public static Object convert(Object value) throws Exception{if(value==null||ClassUtils.isPrimitiveWrapper(value.getClass())) {return value;}if(value instanceof List) {if(((List)value).size()<1) {return value;}convertList((List)value);}else if(value instanceof IPage) {if(((IPage)value).getRecords()==null||((IPage)value).getRecords().size()<1) {return value;}convertList(((IPage)value).getRecords());}else if(value instanceof Map) {Set<Map.Entry<Object,Object>> items = ((Map)value).entrySet();List<Object> list=new ArrayList<>();for(Map.Entry<Object,Object> item:items) {list.add(item.getValue());}convert(list);}else if(value instanceof RT) {Object data=((RT)value).getData();convert(data);}else {convertObject(value);}return value;}public static void convertObject(Object value) throws Exception{convertModelObject(value);convertDictObject(value);}public static void convertList(List<Object> value) throws Exception{convertModelList(value);convertDictList(value);}public static void convertDictObject(Object value) throws Exception {//1、解析出Field,DictTag相关信息Map<Field,DictBind> tags=getDictFields(value.getClass());Map<String,Field> valueFieldMap=mapFields(value.getClass());Set<Field> fields=tags.keySet();//获取所有字典类型得编码Set<String> dictTypes=fields.stream().map(f->tags.get(f).code()).filter(s->!StringUtils.isEmpty(s)).collect(Collectors.toSet());//通过字典类型编码获取所有得字典映射值Map<String,Map<String,Object>> dictsData=getDicts(dictTypes);String clazzName=value.getClass().getName();//通过每个关联Field获取需要赋值得字段for(Field field:fields) {//获取field上的注解信息DictBind tag=tags.get(field);String code=tag.code();//获取字典分类的编码String[] kvs=tag.kvs();//获取映射关系Map<String,String> stMap=new HashMap<>();for(String kv:kvs) {String[] kvitem=kv.split(":");if(kvitem==null||kvitem.length!=2) {log.error("{} dict code:{},kv is invalid",clazzName,code);continue;}stMap.put(kvitem[0], kvitem[1]);}Map<String,Object> dictValues=dictsData.getOrDefault(code, new HashMap<String,Object>());String one=(String) field.get(value);//获取主键的值if(Objects.isNull(one)||StringUtils.isEmpty(one)) {log.info("{}  field {} value is null",clazzName,field.getName());continue;}Object dictValue=dictValues.get(one);if(Objects.isNull(dictValue)) {log.info("{} field {} value {} 's dict value is null",clazzName,field.getName(),one);continue;}Map<String,Field> dictFieldMap=mapFields(dictValue.getClass());Set<String> stkey=stMap.keySet();for(String key:stkey) {Field valuefield=valueFieldMap.get(key);if(valuefield==null) {log.info("{} valuefield :{} is not exists",clazzName,key);continue;}Field dictfield=dictFieldMap.get(stMap.get(key));if(dictfield==null) {log.info("{} valuefield :{}  dictfield :{} is not exists",clazzName,key,stMap.get(key));continue;}valuefield.set(value, dictfield.get(dictValue));}}}public static void convertDictList(List<Object> list) throws Exception{if(list==null||list.size()<1) {return;}Object value=list.get(0);String clazzName=value.getClass().getName();if(value==null||ClassUtils.isPrimitiveWrapper(value.getClass())) {return ;}//1、解析出Field,DictTag相关信息Map<Field,DictBind> tags=getDictFields(value.getClass());if(tags==null||tags.size()<1)return;Map<String,Field> valueFieldMap=mapFields(value.getClass());Set<Field> fields=tags.keySet();//获取所有字典类型得编码Set<String> dictTypes=fields.stream().map(f->tags.get(f).code()).filter(s->!StringUtils.isEmpty(s)).collect(Collectors.toSet());//通过字典类型编码获取所有得字典映射值Map<String,Map<String,Object>> dictsData=getDicts(dictTypes);//通过每个关联Field获取需要赋值得字段for(Field field:fields) {//获取field上的注解信息DictBind tag=tags.get(field);String code=tag.code();//获取字典分类的编码String[] kvs=tag.kvs();//获取映射关系Map<String,String> stMap=new HashMap<>();for(String kv:kvs) {String[] kvitem=kv.split(":");if(kvitem==null||kvitem.length!=2) {log.error("{} dict code:{},kv is invalid",clazzName,code);continue;}stMap.put(kvitem[0], kvitem[1]);}for(Object item:list) {Map<String,Object> dictValues=dictsData.getOrDefault(code, new HashMap<String,Object>());String one=(String) field.get(item);//获取主键的值if(Objects.isNull(one)||StringUtils.isEmpty(one)) {log.info("{} field {} value is null",clazzName,field.getName());continue;}Object dictValue=dictValues.get(one);if(Objects.isNull(dictValue)) {log.info("{} field {} value {} 's dict value is null",clazzName,field.getName(),one);continue;}Map<String,Field> dictFieldMap=mapFields(dictValue.getClass());Set<String> stkey=stMap.keySet();for(String key:stkey) {Field valuefield=valueFieldMap.get(key);if(valuefield==null) {log.info("{} valuefield :{} is not exists",clazzName,key);continue;}Field dictfield=dictFieldMap.get(stMap.get(key));if(dictfield==null) {log.info("{} valuefield :{}  dictfield :{} is not exists",clazzName,key,stMap.get(key));continue;}valuefield.set(item, dictfield.get(dictValue));}}}}public static void convertModelObject(Object value) throws Exception{if(value==null||ClassUtils.isPrimitiveWrapper(value.getClass())) {return ;}Map<Field,FieldBind> tags=getModelFields(value.getClass());if(tags==null||tags.size()<1) {return;}String clazzName=value.getClass().getName();Map<String,Set<Object>> idsMap=new HashMap<>();//ModelTag的 beanname和methodName 组合为key,包含的idsMap<String,List<Field>> fieldGroupSet=new HashMap<>();//同一个方法有几个FieldMap<String,FieldBind> tagMap=new HashMap<>();//ModelTag的 beanname和methodName 组合为key,映射的ModelTagSet<Field> tagKeys=tags.keySet();for(Field field:tagKeys) {FieldBind tag=tags.get(field);String key=tag.beanName()+"_"+tag.methodName();if(!idsMap.containsKey(key)) {idsMap.put(key, new HashSet<>());}if(!fieldGroupSet.containsKey(key)) {fieldGroupSet.put(key, new ArrayList<>());}Set<Object> idsSet=idsMap.get(key);List<Field> fieldGroup=fieldGroupSet.get(key);Object idValue=field.get(value);if(idValue==null) {continue;}idsSet.add(idValue);tagMap.put(key, tag);fieldGroup.add(field);}Set<String> serviceMethodKeys=idsMap.keySet();Map<String,Field> valueFieldsMap=mapFields(value.getClass());for(String key:serviceMethodKeys) {Set<Object> ids=idsMap.get(key);FieldBind ntag=tagMap.get(key);Map<Object,Object> targetValues=getModelData(ntag,ids);List<Field> fields=fieldGroupSet.get(key);for(Field field:fields) {Object id=field.get(value);if(id==null) {continue;}Object target=targetValues.get(id);if(target==null) {continue;}Map<String,Field> targetFieldsMap=mapFields(target.getClass());FieldBind tag=field.getAnnotation(FieldBind.class);String[] kvs=tag.kvs();for(String kv:kvs) {String[] kvitem=kv.split(":");if(kvitem==null||kvitem.length!=2) {log.info("{} code:{},kv is invalid",clazzName,key);continue;}Field sField=valueFieldsMap.get(kvitem[0]);if(sField==null) {log.error("{} key:{} source field:{} not exists",clazzName,key,kvitem[0]);}Field tField=targetFieldsMap.get(kvitem[1]);if(sField==null) {log.error("{} key:{} target field:{} not exists",clazzName,key,kvitem[1]);}sField.set(value, tField.get(target));}}}}public static void convertModelList(List<Object> list) throws Exception{if(list==null||list.size()<1) {return;}Object value=list.get(0);if(value==null||ClassUtils.isPrimitiveWrapper(value.getClass())) {return ;}Map<Field,FieldBind> tags=getModelFields(value.getClass());if(tags==null||tags.size()<1) {return;}Map<String,Set<Object>> idsMap=new HashMap<>();//ModelTag的 beanname和methodName 组合为key,包含的idsMap<String,List<Field>> fieldGroupSet=new HashMap<>();//同一个方法有几个FieldMap<String,FieldBind> tagMap=new HashMap<>();//ModelTag的 beanname和methodName 组合为key,映射的ModelTagSet<Field> tagKeys=tags.keySet();for(Field field:tagKeys) {FieldBind tag=tags.get(field);String key=tag.beanName()+"_"+tag.methodName();if(!idsMap.containsKey(key)) {idsMap.put(key, new HashSet<>());}if(!fieldGroupSet.containsKey(key)) {fieldGroupSet.put(key, new ArrayList<>());}Set<Object> idsSet=idsMap.get(key);List<Field> fieldGroup=fieldGroupSet.get(key);for(Object item:list) {Object idValue=field.get(item);if(idValue!=null) {idsSet.add(idValue);}}tagMap.put(key, tag);fieldGroup.add(field);}Set<String> serviceMethodKeys=idsMap.keySet();Map<String,Field> valueFieldsMap=mapFields(value.getClass());for(String key:serviceMethodKeys) {Set<Object> ids=idsMap.get(key);FieldBind ntag=tagMap.get(key);Map<Object,Object> targetValues=getModelData(ntag,ids);List<Field> fields=fieldGroupSet.get(key);for(Object item:list) {for(Field field:fields) {Object id=field.get(item);if(id==null) {continue;}Object target=targetValues.get(id);if(target==null) {continue;}Map<String,Field> targetFieldsMap=mapFields(target.getClass());FieldBind tag=field.getAnnotation(FieldBind.class);String[] kvs=tag.kvs();for(String kv:kvs) {String[] kvitem=kv.split(":");if(kvitem==null||kvitem.length!=2) {log.info("code:{},kv is invalid",key);continue;}Field sField=valueFieldsMap.get(kvitem[0]);if(sField==null) {log.error("key:{} source field:{} not exists",key,kvitem[0]);}Field tField=targetFieldsMap.get(kvitem[1]);if(sField==null) {log.error("key:{} target field:{} not exists",key,kvitem[1]);}sField.set(item, tField.get(target));}}}}}
//这本方法需要根据实际项目改成从数据库获取字典信息 todostatic Map<String,Map<String,Object>> getDicts(Set<String> dictTypes){Map<String,Map<String,Object>> dictsData=new HashMap<>();for(String key:dictTypes) {Map<String,Object> typeMap=new HashMap<>();dictsData.put(key, typeMap);for(int i=0;i<100;i++) {Dict dict=new Dict();dict.setCode(String.valueOf(i));dict.setValue1("v1"+i);dict.setValue2("v2"+i);typeMap.put(String.valueOf(i), dict);}}return dictsData;}static Map<Object,Object> getModelData(FieldBind tag,Set<Object> ids) throws Exception{String beanName=tag.beanName();String methodName=tag.methodName();Object service=SpringUtils.getBean(beanName);Class<?> serviceClass=service.getClass();Method method=serviceClass.getMethod(methodName, Set.class);return (Map<Object,Object>)method.invoke(service, ids);}private static Map<Field,DictBind> getDictFields(Class<?> clazz){Field[] fields=clazz.getDeclaredFields();Map<Field,DictBind> tags=new HashMap<>();for(Field field:fields) {field.setAccessible(true);DictBind tag=field.getAnnotation(DictBind.class);if(tag==null) {continue;}tags.put(field, tag);}return tags;}private static Map<Field,FieldBind> getModelFields(Class<?> clazz){Field[] fields=clazz.getDeclaredFields();Map<Field,FieldBind> tags=new HashMap<>();for(Field field:fields) {field.setAccessible(true);FieldBind tag=field.getAnnotation(FieldBind.class);if(tag==null) {continue;}tags.put(field, tag);}return tags;}//	private static <T> Map<Field,T> getModelFields(Class<?> clazz,Class<T> tagClazz){
//		Field[] fields=clazz.getDeclaredFields();
//		Map<Field,T> tags=new HashMap<>();
//		for(Field field:fields) {
//			field.setAccessible(true);
//			T tag=field.getDeclaredAnnotation((Class<T>) tagClazz);
//			if(tag==null) {
//				continue;
//			}
//			tags.put(field, tag);
//		}
//		return tags;
//	}private static Map<String,Field> mapFields(Class<?> clazz){Field[] fields=clazz.getDeclaredFields();Map<String,Field> tags=new HashMap<>();for(Field field:fields) {field.setAccessible(true);tags.put(field.getName(), field);}return tags;}}

四、注解的使用

字典实体

package com.anyec.base.model;import io.swagger.annotations.ApiModel;@ApiModel
public class Dict {private String code;private String value1;private String value2;public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getValue1() {return value1;}public void setValue1(String value1) {this.value1 = value1;}public String getValue2() {return value2;}public void setValue2(String value2) {this.value2 = value2;}}

注解的实体


import com.anyec.base.annotation.DictBind;
import com.anyec.base.annotation.FieldBind;import io.swagger.annotations.ApiModel;@ApiModel
public class User {private Long id;@DictBind(code="code1",kvs= {"name:value1","addr:value2"})private String code;private String name;private String addr;@DictBind(code="code2",kvs= {"name2:value1","addr2:value2","addr22:value2"})private String code2;private String name2;private String addr2;private String addr22;@FieldBind(beanName="userService",methodName="mapTeatcherByIds",kvs= {"tname:tname","taddr:taddr"})private Long tid;private String tname;private String taddr;@FieldBind(beanName="userService",methodName="mapTeatcherByIds",kvs=  {"tname2:tname","taddr2:taddr","taddr22:taddr"})private Long tid2;private String tname2;private String taddr2;private String taddr22;@FieldBind(beanName="userService",methodName="mapExtByIds",kvs=  {"extName:extName","extAddr:extAddr"})private Long extId;private String extName;private String extAddr;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}public String getCode2() {return code2;}public void setCode2(String code2) {this.code2 = code2;}public String getName2() {return name2;}public void setName2(String name2) {this.name2 = name2;}public String getAddr2() {return addr2;}public void setAddr2(String addr2) {this.addr2 = addr2;}public Long getTid() {return tid;}public void setTid(Long tid) {this.tid = tid;}public String getTname() {return tname;}public void setTname(String tname) {this.tname = tname;}public String getTaddr() {return taddr;}public void setTaddr(String taddr) {this.taddr = taddr;}public Long getTid2() {return tid2;}public void setTid2(Long tid2) {this.tid2 = tid2;}public String getTname2() {return tname2;}public void setTname2(String tname2) {this.tname2 = tname2;}public String getTaddr2() {return taddr2;}public void setTaddr2(String taddr2) {this.taddr2 = taddr2;}public String getAddr22() {return addr22;}public void setAddr22(String addr22) {this.addr22 = addr22;}public String getTaddr22() {return taddr22;}public void setTaddr22(String taddr22) {this.taddr22 = taddr22;}public Long getExtId() {return extId;}public void setExtId(Long extId) {this.extId = extId;}public String getExtName() {return extName;}public void setExtName(String extName) {this.extName = extName;}public String getExtAddr() {return extAddr;}public void setExtAddr(String extAddr) {this.extAddr = extAddr;}}

五、拦截注解的使用


import java.util.List;
import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import com.anyec.base.annotation.DataFill;
import com.anyec.base.model.RT;
import com.anyec.biz.service.UserService;
import com.anyec.biz.web.model.User;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;@Api
@Controller
@RequestMapping("/biz")
public class BizWeb {@Autowiredprivate UserService userService;@ApiOperation("/getObject")@GetMapping("/getObject")@ResponseBody@DataFillpublic User getObject() {return userService.getObject();}@ApiOperation("/getList")@GetMapping("/getList")@ResponseBody@DataFillpublic List<User> getList() {return userService.getList();}@ApiOperation("/getPage")@GetMapping("/getPage")@ResponseBody@DataFillpublic Page getPage() {Page page=new Page();page.setRecords(getList());return page;}@ApiOperation("/getRTPage")@GetMapping("/getRTPage")@ResponseBody@DataFillpublic RT<Page> getRTPage() {Page page=new Page();page.setRecords(getList());return RT.ok(page);}@ApiOperation("/getRT")@GetMapping("/getRT")@ResponseBody@DataFillpublic RT<User> getRT() {return userService.getRT();}@ApiOperation("/getMap")@GetMapping("/getMap")@ResponseBody@DataFillpublic Map<Long,User> getMap() {return userService.getMap();}@ApiOperation("/getRTList")@GetMapping("/getRTList")@ResponseBody@DataFillpublic RT<List<User>> getRTList() {return userService.getRTList();}}

UserService类


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;import com.anyec.base.model.RT;
import com.anyec.biz.web.model.Teacher;
import com.anyec.biz.web.model.User;
import com.anyec.biz.web.model.UserExt;@Service
public class UserService {private static final Logger log = LoggerFactory.getLogger(UserService.class);public User getObject() {User u=new User();u.setId(1L);u.setCode("1");u.setCode2("2");u.setTid(1L);u.setTid2(2L);u.setExtId(3L);return u;}public List<User> getList() {List<User> list=new ArrayList<>();for(int i=1;i<10;i++) {User u=new User();u.setId(new Long(i));u.setCode(String.valueOf(i));u.setCode2(String.valueOf(i+2));u.setTid(new Long(i));u.setTid2(new Long(i+2));u.setExtId(new Long(i+3));list.add(u);}return list;}public RT<User> getRT() {return RT.ok(getObject());}public Map<Long, User> getMap() {Map<Long, User> map=new HashMap<>();List<User> list=getList();for(User u:list) {map.put(u.getId(), u);}return map;}public RT<List<User>> getRTList() {return RT.ok(getList());}public Map<Long,Teacher> mapTeatcherByIds(Set<Long> ids){log.info(" excute =========> mapTeatcherByIds");Map<Long,Teacher> map=new HashMap<Long, Teacher>();for(Long id:ids) {if(id%5==0) {continue;}Teacher t=new Teacher();t.setId(id);t.setTaddr("taddr-"+id);t.setTname("tname-"+id);map.put(id, t);}return map;}public Map<Long,UserExt> mapExtByIds(Set<Long> ids){log.info(" excute =========> mapExtByIds");Map<Long,UserExt> map=new HashMap<Long, UserExt>();for(Long id:ids) {UserExt t=new UserExt();t.setId(id);t.setExtAddr("extAddr-"+id);t.setExtName("ExtName-"+id);map.put(id, t);}return map;}}

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

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

相关文章

数据库SQLite和SCADA DIAView应用教程

课程简介 此系列课程大纲主要包含七个课时。主要使用到的开发工具有&#xff1a;SQLite studio 和 SCADA DIAView。详细的可成内容大概如下&#xff1a; 1、SQLite 可视化管理工具SQLite Studio &#xff1a;打开数据库和查询数据&#xff1b;查看视频 2、创建6个变量&#x…

YOLOv8改进,YOLOv8检测头融合DSConv(动态蛇形卷积),并添加小目标检测层(四头检测),适合目标检测、分割等

精确分割拓扑管状结构例如血管和道路,对各个领域至关重要,可确保下游任务的准确性和效率。然而,许多因素使任务变得复杂,包括细小脆弱的局部结构和复杂多变的全局形态。在这项工作中,注意到管状结构的特殊特征,并利用这一知识来引导 DSCNet 在三个阶段同时增强感知:特征…

Addressable学习

AssetsBundle是Unity的资源管理机制,将资源打包到AssetsBundle资源包并提供接口能从ab包里面加载资源出来。有了这个机制以后&#xff0c;我们要做资源管理&#xff0c;还需要做: a: 根据项目需求,编写编辑器扩展,提供指定资源打入对应bundle包工具策略; b: 根据项目的需求,资源…

概率密度函数(PDF)分布函数(CDF)——直方图累积直方图——直方图规定化的数学基础

对于连续型随机变量&#xff0c;分布函数&#xff08;Cumulative Distribution Function, CDF&#xff09;是概率密度函数&#xff08;Probability Density Function, PDF&#xff09;的变上限积分&#xff0c;概率密度函数是分布函数的导函数。 如果我们有一个连续型随机变量…

深入解析:Docker 容器如何实现文件系统与资源的多维隔离?

目录 一、RootFs1. Docker 镜像与文件系统层2. RootFs 与容器隔离的意义 二、Linux Namespace1. 进程命名空间1.1 lsns 命令说明1.2 查看“祖先进程”命名空间1.3 查看当前用户进程命名空间 2. 容器进程命名空间2.1 查看容器进程命名空间列表2.2 容器进程命名空间的具体体现 三…

深度学习|表示学习|卷积神经网络|由参数共享引出的特征图|08

如是我闻&#xff1a; Feature Map&#xff08;特征图&#xff09;的概念与 Parameter Sharing&#xff08;参数共享&#xff09;密切相关。换句话说&#xff0c;参数共享是生成 Feature Map 的基础。Feature Map 是卷积操作的核心产物&#xff0c;而卷积操作的高效性正是由参数…

【Linux网络编程】传输层协议

目录 一&#xff0c;传输层的介绍 二&#xff0c;UDP协议 2-1&#xff0c;UDP的特点 2-2&#xff0c;UDP协议端格式 三&#xff0c;TCP协议 3-1&#xff0c;TCP报文格式 3-2&#xff0c;TCP三次握手 3-3&#xff0c;TCP四次挥手 3-4&#xff0c;滑动窗口 3-5&#xf…

ARP 表、MAC 表、路由表、跨网段 ARP

文章目录 一、ARP 表1、PC2、路由器 - AR22203、交换机 - S57004、什么样的设备会有 ARP 表&#xff1f; 二、MAC 表什么样的设备会有 MAC 表&#xff1f; 三、路由表什么样的设备会有路由表&#xff1f; 四、抓取跨网段 ARP 包 所谓 “透明” 就是指不用做任何配置 一、ARP 表…

算法10(力扣20)-有效的括号

1、问题 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类…

每日一题——二叉树的前序遍历和中序遍历和后序遍历

文章目录 二叉树的前序、中序与后序遍历题目描述数据范围&#xff1a;示例&#xff1a;示例 1&#xff1a; 解题思路1. 递归法2. 迭代法 代码实现&#xff08;递归法&#xff09;代码解析示例输出复杂度分析 中序遍历后序遍历 二叉树的前序、中序与后序遍历 题目描述 给定一棵…

【优选算法】8----四数之和

有看过我上篇算法博客并且去做过的铁子们&#xff0c;对这道题的话应该就不会那么陌生了&#xff0c;因为这两道题 的解题思路有着异曲同工之妙~ -----------------------------------------begin------------------------------------- 题目解析&#xff1a; 跟三数之和就多了…

【开源免费】基于SpringBoot+Vue.JS校园失物招领系统(JAVA毕业设计)

本文项目编号 T 150 &#xff0c;文末自助获取源码 \color{red}{T150&#xff0c;文末自助获取源码} T150&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

2025美赛倒计时,数学建模五类模型40+常用算法及算法手册汇总

数学建模美赛倒计时&#xff0c;对于第一次参加竞赛且没有相关基础知识的同学来讲&#xff0c;掌握数学建模常用经典的模型算法知识&#xff0c;并熟练使用相关软件进行建模是关键。本文将介绍一些常用的模型算法&#xff0c;以及软件操作教程。 数学建模常用模型包括&#xf…

【深度学习】常见模型-循环神经网络(Recurrent Neural Network, RNN)

循环神经网络&#xff08;RNN&#xff09; 概念简介 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种用于处理序列数据&#xff08;如时间序列、文本序列等&#xff09;的神经网络模型。与传统神经网络不同&#xff0c;RNN 的结构具有记忆能力&…

Matlab总提示内存不够用,明明小于电脑内存

目录 前言情况1&#xff08;改matlab最大内存限制&#xff09;情况2&#xff08;重启电脑&#xff09;情况3 前言 在使用matlab中&#xff0c;有时候需要占用的内存并没有超过电脑内存依旧会报错&#xff0c;提示内存不够用&#xff0c;可以尝试下面几种方法&#xff0c;总有一…

数据结构(Java)——二叉树

1.概念 二叉树是一种树形数据结构&#xff0c;其中每个节点最多有两个子节点&#xff0c;通常被称为左子节点和右子节点。二叉树可以是空的&#xff08;即没有节点&#xff09;&#xff0c;或者由一个根节点以及零个或多个左子树和右子树组成&#xff0c;其中左子树和右子树也分…

Windows电脑上记录工作待办清单的工具用哪个?

在Windows电脑上记录日常工作待办清单的工具用哪一个比较好呢&#xff1f;想要工作效率高&#xff0c;借助Windows电脑上的待办清单工具&#xff0c;可以帮助大家快速完成各项任务&#xff0c;今天给大家盘点几款工作待办清单工具。 Windows自带的便笺Stickynotes Windows自…

H266/VVC 量化编码中 JCCR 技术

色度联合编码 JCCR VVC 支持色度分量联合编码(Joint Coding of Chroma Residual&#xff0c;JCCR)&#xff0c; 两个色度残差联合编码。通过 TU 的标志位 tu_joint_cbcr_residual_flag 指定该工 具&#xff0c;并通过 CBF 来隐式传输所选的模式。仅当 TU 的至少一个色度分量的 …

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目&#xff0c;由于其良好的架构设计和完善的生态&#xff0c;迅速成为了监控…

DAY3,模拟终端

题目 实现一个终端的功能&#xff0c;注意需要带有cd功能 思路 如何 C语言执行shell命令&#xff1f; 使用进程替换exec函数&#xff1b;&#xff1b;使用system函数。 如何 切换工作目录&#xff1f; 使用chdir函数切换工作目录。 其…