Json工具(一)- Jackson(续)

5、Jackson常用注解

@JsonProperty
自定义属性在序列化和反序列化过程中所对应的JSON字段的名称,还可以指定是否序列化和反序列化。属性如下:
value:设置属性的名称。一般当JSON串中的key与对象中的属性名称不一致,比如分别采用了下划线命名与驼峰命名。
defaultValue:用于记录预期的默认值
required:定义在反序列化期间是否需要属性的值。
index:序列化时属性的顺序,默认为-1,越小越靠前。
access:更改序列化和反序列化中逻辑属性的可见性,A逻辑属性的可见性仅根据可见性和其他注释确定,access的默认值。
READ_ONLY 逻辑属性仅在序列化时可见(属性值参与序列化)、WRITE_ONLY 逻辑属性仅在反序列化时可见(属性值参与反序列化)、READ_WRITE 逻辑属性在序列化和反序列化时都可见
@JsonAlias
反序列化的时候可以让Bean的属性接收多个json字段的名称。
@JsonAutoDetect
控制序列化和反序列化过程中Java对象中访问修饰符的序列化策略。用于注解或者类上,默认为ANY。
@JsonIgnore
在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。一般标记在属性或者方法上,返回的json数据即不包含该属性。
@JsonIgnoreProperties
此注解是类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
@JsonIgnoreType
该类作为别的类的属性时,该属性忽略序列化和反序列化。
@JsonInclude
是为实体类在接口序列化返回值时增加规则的注解
ALWAYS为默认值,表示全部序列化,即默认返回全部字段
NON_NULL表示值为null就不序列化,即值为null的字段不返回(当实例对象中有Optional或AtomicReferenceAtomicReferenceAtomicReference类型的成员变量时,如果Optional或AtomicReference引用的实例为null,用NON_NULL 不能使该字段不做序列化,此时应使用NON_ABSENT规则)
NON_ABSENT可在实例对象中有Optional或AtomicReference类型的成员变量时,如果Optional或AtomicReference引用的实例为null时,也可使该字段不做序列化,同时可以排除值为null的字段
NON_EMPTY排除字段值为null、空字符串、空集合、空数组、Optional类型引用为空,AtomicReference类型引用为空
NON_DEFAULT没有更改的字段不序列化,即未变动的字段不返回
CUSTOM:这个值要配合valueFilter属性一起使用,在序列化的时候会执行CustomFilter中的的equals方法,该方法的入参就是字段的值,如果equals方法返回true,字段就不会被序列化,如果equals方法返回false时字段才会被序列化,即true时不返回,false时才返回

@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = CustomFilter.class)
private String field;static class CustomFilter {@Overridepublic boolean equals(Object obj) {// 为null,或者不是字符串就返回true,即不返回该字段if (null == obj || !(obj instanceof String)) {return true;}// 长度大于2就返回true,意味着不被序列化return ((String) obj).length() > 2;}
}
@JsonFormat
是一个时间格式化注解,比如我们存储在mysql中的数据是date类型的,当我们读取出来封装在实体类中的时候,就会变成英文时间格式,而不是yyyy-MM-dd HH:mm:ss这样的中文时间,因此我们需要用到JsonFormat注解来格式化我们的时间。
@JsonUnwrapped
表明属性应该以扁平化的形式进行序列化,即目标属性将不会序列化为 JSON 对象,但其属性将序列化为包含它的对象的属性。
@JacksonInject
在使用JSON格式进行反序列化的时候,我们经常有这样一些需求。我们从客户端或者其他渠道获取了一个JSON格式的数据对象,该对象包含若干个属性。但是我们在将JSON字符串反序列化的时候,需要给它加上一些默认数据

@Data
public class PlayerStar {private String name;private Integer age;// 业余爱好,数组private String[] hobbies;// 朋友private List<String> friends;// 年收入 Mapprivate Map<String, BigDecimal> salary;@JacksonInject("responseTime")private LocalDateTime responseTime;
}public class App {public static void main(String[] args) throws Exception {ObjectMapper objectMapper = new ObjectMapper();// 为responseTime赋值为当前值InjectableValues.Std injectableValues = new InjectableValues.Std();injectableValues.addValue("responseTime", LocalDateTime.now());// 在反序列化过程中赋值给对象objectMapper.setInjectableValues(injectableValues);String jsonInString = "{\"name\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";PlayerStar jordan = objectMapper.readValue(jsonInString, PlayerStar.class);System.out.println(jordan);}}
@JsonAnyGetter和@JsonAnySetter
@JsonAnySetter:可以将序列化时未识别到的属性都扔进一个map里。
@JsonAnyGetter:将map里的属性都平铺输出。
public class TestAnyGetterAndSetter {public static void main(String[] args) throws JsonProcessingException {String json1 = "{\"name\":\"zhangSan\",\"id\":1,\"address\":\"china\"}";ObjectMapper objectMapper = new ObjectMapper();Account account = objectMapper.readValue(json1, Account.class);System.out.println(account.getMap());String jsonString = objectMapper.writeValueAsString(account);System.out.println(jsonString);}}class Account {private long id;private String name;private Map<String, Object> map;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@JsonAnySetterpublic void setMap(String key, Object value) {if (map == null) {map = new HashMap<>();}map.put(key, value);}@JsonAnyGetterpublic Map<String, Object> getMap() {return map;}
}
@JsonSetter 和 @JsonGetter
@JsonSetter 和 @JsonGetter:@JsonSetter只能用于setter方法,@JsonGetter只能用户getter方法,只用二者中的一个标签时,与@JsonProperty作用一模一样。
@JsonCreator
用于构造方法或者静态方法上面,加了@JsonCreator注解,该类的对象在反序列化时,就走有@JsonCreator注解的方法来反序列化,原先无参+set的过程失效。
public class TestJsonCreator {public static void main(String[] args) throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();Page page = objectMapper.readValue("{" +"    \"page_size\":12,\n" +"    \"page_num\":1,\n" +"    \"name\":\"Java\"\n" +"}", Page.class);System.out.println(page);}
}@Data
@AllArgsConstructor
class Page {@JsonProperty(value = "page_size")private int pageSize;@JsonProperty(value = "page_num")private int pageNum;private String name;@JsonCreatorpublic static Page unSerialize() {System.out.println("正在反序列化成对象");return new Page(12, 1, "Java");}
}
public class TestJsonCreator {public static void main(String[] args) throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();Page page = objectMapper.readValue("{" +"    \"page_size\":12,\n" +"    \"page_num\":1,\n" +"    \"name\":\"Java\"\n" +"}", Page.class);System.out.println(page);}
}@Data
class Page {@JsonProperty(value = "page_size")private int pageSize;@JsonProperty(value = "page_num")private int pageNum;private String name;@JsonCreatorpublic Page(@JsonProperty("name") String name,@JsonProperty("page_num") int pageNum,@JsonProperty("page_size") int pageSize) {System.out.println("@JsonCreator生效");this.pageNum = pageNum;this.pageSize = pageSize;this.name = name;}
}
@JsonValue
用于get方法、属性字段,一个类只能用一个,加上这个注解时,该类的对象序列化时就会只返回这个字段的值做为序列化的结果。比如一个枚举类的get方法上加上该注解,那么在序列化这个枚举类的对象时,返回的就是枚举对象的这个属性,而不是这个枚举对象的序列化json串。
@JsonPropertyOrder
用于指定实体生成 json 时的属性顺序,一般用得不多
@JsonRawValue
能够按原样序列化属性。属性值不会被转义或者加引号(或者说,会自动去掉转义,多余的引号)。属性值已经是一个 JSON String,或者属性值已经被加了引号时很有用。
public class TestJsonRawValue {public static void main(String[] args) throws JsonProcessingException {News news = new News();news.setContent("\"中国No.1\"");news.setTitle("中国崛起!");news.setPublishTime(new Date());System.out.println("-- before serialization --");ObjectMapper objectMapper = new ObjectMapper();String jsonString = objectMapper.writeValueAsString(news);System.out.println(jsonString);News news1 = objectMapper.readValue(jsonString, News.class);System.out.println(news1);}
}@Data
class News {@JsonRawValueprivate String content;private String title;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date publishTime;
}
-- before serialization --
{"content":"\"中国No.1\"","title":"中国崛起!","publishTime":"2024-02-28 10:47:00"}
News(content="中国No.1", title=中国崛起!, publishTime=Wed Feb 28 10:47:00 CST 2024)-- after serialization --
{"content":"中国No.1","title":"中国崛起!","publishTime":"2024-02-28 10:47:41"}
News(content=中国No.1, title=中国崛起!, publishTime=Wed Feb 28 10:47:41 CST 2024)
@JsonRootName
用来指定root wrapper的名字。注意,只有当WRAP_ROOT_VALUE开启时,此注解才生效
@JsonSerialize
用于字段或get方法上,自定义序列化过程
@JsonDeserialize
用于字段或set方法上,自定义反序列化过程
@JacksonAnnotation
标注该注解是Jackson的注解,会被Jackson处理
@JacksonAnnotationsInside
自定义Jackson注解的组合注解
@JsonView
不同请求获取的对象的视图不同(属性数量不一致),使用@JsonView配合自定义视图实现
public class CompanyViews {public static class Normal {};public static class Manager extends Normal {};public static class HR extends Normal {};}
public class Staff {@JsonView(CompanyViews.Normal.class)private String name;@JsonView(CompanyViews.Normal.class)private int age;// two views@JsonView({CompanyViews.HR.class, CompanyViews.Manager.class})private String[] position;@JsonView(CompanyViews.Manager.class)private List<String> skills;@JsonView(CompanyViews.HR.class)private Map<String, BigDecimal> salary;
}    
public class JacksonExample {public static void main(String[] args) {ObjectMapper mapper = new ObjectMapper();Staff staff = createStaff();try {mapper.enable(SerializationFeature.INDENT_OUTPUT);// normalString normalView = mapper.writerWithView(CompanyViews.Normal.class).writeValueAsString(staff);System.out.format("Normal views\n%s\n", normalView);// managerString managerView = mapper.writerWithView(CompanyViews.Manager.class).writeValueAsString(staff);System.out.format("Manager views\n%s\n", managerView);// hrString hrView = mapper.writerWithView(CompanyViews.HR.class).writeValueAsString(staff);System.out.format("HR views\n%s\n", hrView);} catch (IOException e) {e.printStackTrace();}}private static Staff createStaff() {Staff staff = new Staff();staff.setName("mkyong");staff.setAge(38);staff.setPosition(new String[]{"Founder", "CTO", "Writer"});Map<String, BigDecimal> salary = new HashMap() {{put("2010", new BigDecimal(10000));put("2012", new BigDecimal(12000));put("2018", new BigDecimal(14000));}};staff.setSalary(salary);staff.setSkills(Arrays.asList("java", "python", "node", "kotlin"));return staff;}}
Normal views
{"name" : "mkyong","age" : 38
}Manager views
{"name" : "mkyong","age" : 38,"position" : [ "Founder", "CTO", "Writer" ],"skills" : [ "java", "python", "node", "kotlin" ]
}HR views
{"name" : "mkyong","age" : 38,"position" : [ "Founder", "CTO", "Writer" ],"salary" : {"2018" : 14000,"2012" : 12000,"2010" : 10000}
}

6、自定义序列化和反序列化案例

自定义序列化工具的步骤

  1. 实现JsonSerializer自定义序列化逻辑
  2. 实现JsonDeserializer自定义反序列化逻辑
    如需获取字段相关的其他元素信息需要实现ContextualDeserializer
    接口获取上下文。然后获取字段的JavaType,Jackson提供了TypeFactory获取JavaType,调用ObjectCodec工具反序列化
    没有泛型无需获取JavaType,直接使用readValue(String content, Class valueType)
  3. 在需要处理的字段添加注解
/*案例相关entity*/
@Data
public class MyDto {@ObjAndArrayConverter(clazz = Bodys.class, internal = Person.class)@JsonProperty("bodys")private Bodys<Person> bodys;
}@Data
public class Bodys<T> {@JsonProperty("commonField")private String commonField;private T body;
}@Data
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.ANY)
public class Person {@JsonProperty(value = "myName", index = 4)private String name;@JsonProperty(value = "myAge", index = 3)private Integer age;@JsonProperty(value = "birthday", index = 2)@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")@JsonInclude(JsonInclude.Include.NON_NULL)private Date date;@JsonProperty(value = "myHeight", index = 1)private int height;@JsonIgnoreprivate Action action;@JacksonInject(value = "responseTime")private Date responseTime;
}
/*自定义序列化工具*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonDeserialize(using = ObjAndArrayDeserializer.class)
@JsonSerialize(using = ObjAndArraySerializer.class)
public @interface ObjAndArrayConverter {Class<?> clazz();Class<?> internal();
}/*自定义序列化处理逻辑*/
public class ObjAndArraySerializer extends JsonSerializer {@Overridepublic void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {gen.writeStartArray();gen.writeObject(value);gen.writeEndArray();}
}/*自定义反序列化处理逻辑*/
public class ObjAndArrayDeserializer extends StdDeserializer<Object> implements ContextualDeserializer {private Class<?> clazz;private Class<?> internal;/*** jackson 反序列化执行的时候需要知道当前的字段需要反序列化到哪个对象,需要获取对应的JavaType,如果没有泛型可以不获取JavaType。* 如果是Person的JavaType TypeFactory.defaultInstance().constructType(Person.class);可以不获取JavaType,直接使用readValue(String content, Class<T> valueType)*/private JavaType javaType;public ObjAndArrayDeserializer(Class<?> clazz, Class<?> internal) {super(clazz);this.clazz = clazz;this.internal = internal;// 获取JavaType的工厂对象以获取JavaTypeTypeFactory typeFactory = TypeFactory.defaultInstance();// 获取Bodys<Person>对应的JavaTypethis.javaType = typeFactory.constructParametricType(this.clazz, this.internal);// 如果是List<Person>对应的JavaType,TypeFactory.defaultInstance().constructParametricType(List.class,Person.class);}public ObjAndArrayDeserializer() {super(Object.class);}@Overridepublic Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {JsonToken currentToken = p.getCurrentToken();if (currentToken == JsonToken.START_ARRAY) {p.nextToken();Object o = p.getCodec().readValue(p, this.javaType);p.nextToken();return o;} else {return null;}}/*获取Field的相关信息,以获取对应的JavaType,缓存了反序列化器,需要重启才会再走*/@Overridepublic JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {ObjAndArrayConverter converter = property.getAnnotation(ObjAndArrayConverter.class);this.clazz = converter.clazz();this.internal = converter.internal();return new ObjAndArrayDeserializer(converter.clazz(), converter.internal());}
}

7、Jackson多态的序列化与反序列化


@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.EXISTING_PROPERTY,property = "type",visible = true
)
@JsonSubTypes(value = {@JsonSubTypes.Type(value = JacksonProduct1.class, name = "product1"),@JsonSubTypes.Type(value = JacksonProduct2.class, name = "product2")}
)
@Data
public abstract class JacksonParent {/*抽象的公有字段*/private String year = "2024";
}@Data
public class JacksonProduct1 extends JacksonParent {private String type = "product1";private String name;
}@Data
public class JacksonProduct2 extends JacksonParent {private String type = "product2";private String name;
}@Data
public class JacksonProduct {private List<JacksonParent> jacksonProduct;
}public static void main(String[] args) throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();JacksonProduct jacksonProduct = new JacksonProduct();JacksonProduct1 jacksonProduct1 = new JacksonProduct1();jacksonProduct1.setName("json1");JacksonProduct2 jacksonProduct2 = new JacksonProduct2();jacksonProduct2.setName("json2");List<JacksonParent> list = new ArrayList<>();list.add(jacksonProduct1);list.add(jacksonProduct2);jacksonProduct.setJacksonProduct(list);String s = objectMapper.writeValueAsString(jacksonProduct);System.out.println("序列化成字符串:" + s);// 序列化成字符串:{"jacksonProduct":[{"year":"2024","type":"product1","name":"json1"},{"year":"2024","type":"product2","name":"json2"}]}System.out.println("转换后的实体类结果:");System.out.println(objectMapper.readValue(s, JacksonProduct.class));// JacksonProduct(jacksonProduct=[JacksonProduct1(type=product1, name=json1), JacksonProduct2(type=product2, name=json2)])
}

8、Jackson序列化和反序列化执行流程

Jackson序列化流程

1. 获取相关的ObjectCodec
2. 初始化JsonGenerator
3. 获取DefaultSerializerProvider
4. 获取JsonSerializer
5. 开始序列化
6. 关闭资源

Jackson反序列化流程

1. 获取相关的ObjectCodec
2. 初始化JsonParser
3. DefaultDeserializationContext
4. 初始化JsonToken
5. 获取JsonDeserializer
6. 开始反序列化
7. 关闭资源

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

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

相关文章

固定表头、首列 —— uniapp、vue 项目

项目实地&#xff1a;也可以在 【微信小程序】搜索体验&#xff1a;xny.handbook 另一个体验项目&#xff1a;官网 一、效果展示 二、代码展示 &#xff08;1&#xff09;html 部分 <view class"table"><view class"tr"><view class&quo…

微服务——网关、网关登录校验、OpenFeign传递共享信息、Nacos共享配置以及热更新、动态路由

之前学习了Nacos&#xff0c;用于发现并注册、管理项目里所有的微服务&#xff0c;而OpenFeign简化微服务之间的通信&#xff0c;而为了使得前端可以使用微服务项目里的每一个微服务的接口&#xff0c;就应该将所有微服务的接口管理起来方便前端调用&#xff0c;所以有了网关。…

[免费]微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端+Vue管理端)(高级版)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端Vue管理端)(高级版)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端Vue管理端)(高级版…

Android15请求动态申请存储权限完整示例

效果: 1.修改AndroidManifest.xml增加如下内容: <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-perm

深度学习系列79:Text2sql调研

参考 https://github.com/topics/text-to-sql 这里是一些资源&#xff1a;https://github.com/eosphoros-ai/Awesome-Text2SQL/blob/main/README.zh.md 这里是综述文章&#xff1a;https://zhuanlan.zhihu.com/p/647249972 1. 数据集 Spider: 一个跨域的复杂text2sql数据集&a…

Deepseek应用技巧-chatbox搭建前端问答

目标&#xff1a;书接上回&#xff0c;由于本地私有化部署了deepseek的大模型&#xff0c;那怎么能够投入生产呢&#xff0c;那就必须有一个前端的应用界面&#xff0c;好在已经有很多的前人已经帮我们把前段应用给搭建好了&#xff0c;我们使用就可以啦&#xff0c;今天我们就…

Bootstrap:图标库的安装及其使用

一、安装 使用npm包管理器安装。 npm i bootstrap-icons 二、使用图标 首先先引入bootstrap-icons.css库&#xff0c;然后从官方网站选择想要的图标然后复制使用代码。 示例代码&#xff1a;使用vue引入对应css文件后&#xff0c;使用库图标。 <script setup>import &qu…

Linux网络之数据链路层协议

目录 数据链路层 MAC地址与IP地址 数据帧 ARP协议 NAT技术 代理服务器 正向代理 反向代理 上期我们学习了网络层中的相关协议&#xff0c;为IP协议。IP协议通过报头中的目的IP地址告知了数据最终要传送的目的主机的IP地址&#xff0c;从而指引了数据在网络中的一步…

TCP7680端口是什么服务

WAF上看到有好多tcp7680端口的访问信息 于是上网搜索了一下&#xff0c;确认TCP7680端口是Windows系统更新“传递优化”功能的服务端口&#xff0c;个人理解应该是Windows利用这个TCP7680端口&#xff0c;直接从内网已经具备更新包的主机上共享下载该升级包&#xff0c;无需从微…

“量子心灵AI“的监控仪表盘 - javascript网页设计案例

【前端实战】基于Three.js和Chart.js打造未来科技风AI监控仪表盘 本文通过AI辅助开发&#xff0c;详细记录了一个高级前端项目的完整实现过程。文章包含核心代码片段、技术要点及遇到的问题与解决方案。适合有一定前端基础的开发者学习参考。 1. 项目概述 本文详细介绍了一个名…

vtkDepthSortPolyData 根据相机视图方向对多边形数据进行排序

1. 作用 在 3D 渲染中&#xff0c;透明对象的渲染顺序非常重要。如果透明对象的渲染顺序不正确&#xff0c;可能会导致错误的视觉效果&#xff08;例如&#xff0c;远处的透明对象遮挡了近处的透明对象&#xff09;。vtkDepthSortPolyData 通过对多边形数据进行深度排序&#…

第十五章:go package 包的管理

import f "fmt"   // 注意 这里 f 是包的别名 init初始化函数 在每一个Go源文件中&#xff0c;都可以定义任意个如下格式的特殊函数&#xff1a; func init(){// ... } package&#xff1a;声明包的关键字 packagename&#xff1a;包名&#xff0c;可以不与文…

【从零开始学习计算机科学】计算机组成原理(七)存储器与存储器系统

【从零开始学习计算机科学】计算机组成原理(七)存储器与存储器系统 存储器存储器相关概念存储器分类存储器系统存储器性能指标存储器层次概述程序访问的局部性原理SRAM存储器存储器的读写周期DRAM存储器DRAM控制器高性能的主存储器存储器扩展只读存储器ROM光擦可编程只读存储…

开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器

开源&#xff01;速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器 目录 开源&#xff01;速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器本项目未经授权&#xff0c;禁止商用&#xff01;本项目未经授权&#xff0c;禁止商用&#xff01;本项目未经授权&…

20250212:linux系统DNS解析卡顿5秒的bug

问题: 1:人脸离线识别记录可以正常上传云端 2:人脸在线识别请求却一直超时 3:客户使用在线网络 思路:

爱普生温补晶振 TG5032CFN高精度稳定时钟的典范

在科技日新月异的当下&#xff0c;众多领域对时钟信号的稳定性与精准度提出了极为严苛的要求。爱普生温补晶振TG5032CFN是一款高稳定性温度补偿晶体振荡器&#xff08;TCXO&#xff09;。该器件通过内置温度补偿电路&#xff0c;有效抑制环境温度变化对频率稳定性的影响&#x…

【病毒分析】熊猫烧香病毒分析及其查杀修复

目录 前言 一、样本概况 1.1 样本信息 1.2 测试环境及工具 1.3 分析目标 二、具体行为分析 2.1 主要行为 2.1.1 恶意程序对用户造成的危害 2.2 恶意代码分析 2.2.1 加固后的恶意代码树结构图(是否有加固) 2.2.2 恶意程序的代码分析片段 三、解决方案(或总结) 3.1 …

JavaWeb后端基础(7)AOP

AOP是Spring框架的核心之一&#xff0c;那什么是AOP&#xff1f;AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实说白了&#xff0c;面向切面编程就是面向特定方法编程。AOP是一种思想&#xff0c;而在Spring框…

AutoDL平台租借GPU,创建transformers环境,使用VSCode SSH登录

AutoDL平台租借GPU&#xff0c;创建transformers环境&#xff0c;使用VSCode SSH登录 一、AutoDl平台租用GPU 1.注册并登录AutoDl官网&#xff1a;https://www.autodl.com/home 2.选择算力市场&#xff0c;找到需要的GPU&#xff1a; 我这里选择3090显卡 3.这里我们就选择P…

三维建模与视频融合(3D-Video Integration)技术初探。

三维建模与视频融合&#xff08;3D-Video Integration&#xff09;是一种将虚拟三维模型无缝嵌入实拍视频场景的技术&#xff0c;广泛应用于影视特效、增强现实&#xff08;AR&#xff09;、游戏开发、广告制作 、视频监控 等领域。 一、技术核心流程 三维建模与动画 使用工具…