由浅到深认识Java语言(42):反射

该文章Github地址:https://github.com/AntonyCheng/java-notes

在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!

上一章:由浅到深认识Java语言(41):反射

47.反射

反射的应用

获取类型的详细信息(了解)

可以获取:包、修饰符、类型名、父类(包括泛型父类)、父接口(包括泛型父接口)、成员(属性、构造器、方法)、注解(类上的、方法上的、属性上的);

  • 获取包信息:

    Package pkg = clazz.getPackage();
    
  • 获取修饰符:

    int mod = clazz.getModifiers();
    

    修饰符定义在Modifier类中,该类里面有很多常量值,每一个常量对应一种修饰符;

  • 获取类名:

    String name = clazz.getName();
    
  • 获取父类的字节码对象:

    Class superclass = clazz.getSuperclass();
    
  • 获取该类实现的所有接口:

    Class[] interfaces = clazz.getInterfaces();
    
  • 获取该类的所有属性:

    Field[] declaredFields = clazz.getDeclaredFields();
    
  • 获取该类的所有构造函数:

    Method[] declaredMethods = clazz.getDeclaredMethods();
    
  • 获取该类的所有方法:

    Method[] declaredMethods = clazz.getDeclaredMethods();
    
  • 获取该类的所有构造方法:

    Constructor[] constructors = clazz.getConstructors();
    

示例如下:

package top.sharehome.Test;import java.lang.reflect.Constructor;public class Demo {public static void main(String[] args) throws Exception {Class clazz = Class.forName("top.sharehome.Test.Test");System.out.println("clazz3 = " + clazz);System.out.println("clazz.getPackage() = " + clazz.getPackage());System.out.println("clazz.getModifiers() = " + clazz.getModifiers());System.out.println("clazz.getName() = " + clazz.getName());System.out.println("clazz.getSuperclass() = " + clazz.getSuperclass());System.out.println("clazz.getInterfaces() = " + clazz.getInterfaces());System.out.println("clazz.getDeclaredField() = " + clazz.getDeclaredFields());System.out.println("clazz.getDeclaredMethods() = " + clazz.getDeclaredMethods());System.out.println("clazz.getConstructors() = " + clazz.getConstructors());}
}interface Father{void Hello();
}class Test implements Father{private String name = "xiaochen";public Test() {}public Test(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void Hello() {System.out.println("hello");}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建任意引用类型的对象(重点)

相关方法

Class类型对象.newInstance() ;(JDK 9 后被弃用)

Class类型对象.getDeclaredConstructor().newInstance();(newInstance() 替代品)

这里主要学习第二个方法;

Class类型对象.getDeclaredConstructor(parameterTypes···).newInstance(initargs···);

  • getDeclaredConstructor(parameterTypes···) 是获取一个 Class 类型自带的构造方法,参数就是类中构造方法参数.class;

    示例如下:

    //构造方法如下
    public Test(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;
    }
    //获得类的构造方法如下
    Class clazz = Test.class;
    Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class, char.class);
    
  • newInstance(initargs···) 是在获得了构造器的基础上将 Class 类型对象转换为 Object 对象,这里要注意该方法的参数需要和 claredConstructor(parameterTypes···) 里的参数相匹配;

    示例如下:

    //构造方法如下
    public Test(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;
    }
    //引入对象如下:
    Class clazz1 = Test.class;
    Object o1 = clazz1.getDeclaredConstructor(String.class,int.class,char.class).newInstance("xiaowu",21,'男');
    

整体示例如下:

package top.sharehome.Test;public class Demo {public static void main(String[] args) throws Exception {Class clazz1 = Test.class;Object o1 = clazz1.getDeclaredConstructor(String.class,int.class,char.class).newInstance("xiaowu",21,'男');Test t1 = (Test) o1;System.out.println("t1.getName() = " + t1.getName());}
}class Test{private String name = "xiaochen";private int age = 21;private char gender = '女';public Test() {}public Test(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;}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 char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

任意类型框架设计

框架类:

package top.sharehome.Test;public class CreateBean {public static Object CreateBean(Class clazz) throws Exception {return clazz.getDeclaredConstructor().newInstance();}
}

使用类:

package top.sharehome.Test;public class Demo {public static void main(String[] args) throws Exception {Test t = (Test) CreateBean.CreateBean(Test.class);System.out.println(t);}
}class Test{private String name = "xiaochen";private int age = 21;private char gender = '女';public Test() {}public Test(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;}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 char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}@Overridepublic String toString() {return "Test{" +"name='" + name + '\'' +", age=" + age +", gender=" + gender +'}';}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

操作任意类型的属性(重点)

  • 获取该类型的Class对象

    Class clazz = Class.forName(类型全名称);
    
  • 获取属性对象

    Field field = clazz.getDeclaredField(属性变量名);
    
  • 设置属性可访问

    field.setAccessible(true);
    
  • 创建实例对象:如果操作的是非静态属性,需要创建实例对象

    Object obj = clazz.getDeclaredConstructor().newInstance();
    
  • 设置属性值

    field.set(obj,"chai");
    
  • 获取属性值

    Object value = field.get(obj);
    

操作如下:

  • 利用获取一个类中的所有的变量属性名和值;

    package top.sharehome.Test;import java.lang.reflect.Field;public class Demo {public static void main(String[] args) throws Exception {Class clazz = Test.class;Field[] declaredFields = clazz.getDeclaredFields();Test t = (Test) clazz.getDeclaredConstructor().newInstance();for (Field f : declaredFields) {//因为对象中有私有属性,所以要设置属性的可见性//这种设置可见性的做法也叫做暴力反射f.setAccessible(true);//获取属性名String name = f.getName();//获取属性值Object o = f.get(t);System.out.println("name:field = " + name + ":" + o);}}
    }class Test {private String name = "xiaochen";private int age = 21;private char gender = '女';public Test() {}public Test(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;}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 char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}@Overridepublic String toString() {return "Test{" +"name='" + name + '\'' +", age=" + age +", gender=" + gender +'}';}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 获取一个类中的某一个变量属性名和值;

    package top.sharehome.Test;import java.lang.reflect.Field;public class Demo {public static void main(String[] args) throws Exception {Class clazz = Test.class;Test t = (Test) clazz.getDeclaredConstructor().newInstance();Field FName = clazz.getDeclaredField("name");FName.setAccessible(true);String name = FName.getName();Object o = FName.get(t);System.out.println("name:field ="+name+":"+o);}
    }class Test {private String name = "xiaochen";private int age = 21;private char gender = '女';public Test() {}public Test(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;}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 char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}@Overridepublic String toString() {return "Test{" +"name='" + name + '\'' +", age=" + age +", gender=" + gender +'}';}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 修改一个类中的某一属性值;

    package top.sharehome.Test;import java.lang.reflect.Field;public class Demo {public static void main(String[] args) throws Exception {Class clazz = Test.class;Test t = (Test) clazz.getDeclaredConstructor().newInstance();Field FName = clazz.getDeclaredField("name");FName.setAccessible(true);String name = FName.getName();Object o = FName.get(t);System.out.println("name:field ="+name+":"+o);System.out.println("修改后:");FName.set(t,"xiaowu");Object o1 = FName.get(t);System.out.println("name:field ="+name+":"+o1);}
    }class Test {private String name = "xiaochen";private int age = 21;private char gender = '女';public Test() {}public Test(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;}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 char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}@Overridepublic String toString() {return "Test{" +"name='" + name + '\'' +", age=" + age +", gender=" + gender +'}';}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

操作任意类型的方法(重点)

(1)获取该类型的Class对象

Class clazz = Class.forName(类型全名称);

(2)获取方法对象

Method method = clazz.getDeclaredMethod("login",String.class,String.class);

(3)创建实例对象

Object obj = clazz.getDeclaredConstructor().newInstance();

(4)调用方法

Object result = method.invoke(obj,"chai","123");

如果方法的权限修饰符修饰的范围不可见,也可以调用setAccessible(true);

如果方法是静态方法,实例对象也可以省略,用null代替;

如果方法是无参的,那么只需要在 clazz.getDeclaredMethod() 方法中只传入方法名,method.invoke() 方法中传入引入对象名即可;

操作如下:

调用方法示例;

package top.sharehome.Test;import java.lang.reflect.Method;public class Demo {public static void main(String[] args) throws Exception {Class clazz = Test.class;Object o = clazz.getDeclaredConstructor().newInstance();Method method = clazz.getDeclaredMethod("Method", String.class, int.class, char.class);//因为方法是私有的method.setAccessible(true);Object invoke = method.invoke(o, "xiaowu", 21, '男');System.out.println("return = " + invoke);}
}class Test {private String name = "xiaochen";private int age = 21;private char gender = '女';public Test() {}public Test(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;}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 char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}@Overridepublic String toString() {return "Test{" +"name='" + name + '\'' +", age=" + age +", gender=" + gender +'}';}private String Method(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;System.out.println("这是一个返回 Test 类中具体值的方法");return "" + this.name + " " + this.age + " " + this.gender;}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Type接口的介绍和获取(了解)

java.lang.reflect.Type 接口及其相关接口用于描述 java 中用到的所有类型,是 Java 的反射中很重要的组成部分。Type 是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型,站在反射的角度上看,Java 生态所有的类都由 Type 接口支撑;

使用反射获取Type

有很多场景下我们可以获得Type,比如:

  • 当我们拿到一个Class,用 Class.getGenericInterfaces() 方法得到Type[],也就是这个类实现接口的Type类型列表,由于 Class 类实现 Type 接口,是父子关系,所以该方法与 clazz.getInterfaces() 方法获得的内容一样;

    package top.sharehome.Test;import java.lang.reflect.Type;public class Demo {public static void main(String[] args) {Class clazz = Test.class;Type[] genericInterfaces = clazz.getGenericInterfaces();Class[] interfaces = clazz.getInterfaces();System.out.println("Type[] 遍历如下:");for (Type t:genericInterfaces) {System.out.println(t);}System.out.println("Class[] 遍历如下:");for (Class c:interfaces) {System.out.println(c);}}
    }interface Father1{}interface Father2{}class Father3 {}class Test extends Father3 implements Father1,Father2 {private String name = "xiaochen";private int age = 21;private char gender = '女';public Test() {}public Test(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;}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 char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}@Overridepublic String toString() {return "Test{" +"name='" + name + '\'' +", age=" + age +", gender=" + gender +'}';}private String Method(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;System.out.println("这是一个返回 Test 类中具体值的方法");return "" + this.name + " " + this.age + " " + this.gender;}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 当我们拿到一个 Class,用 Class.getDeclaredFields() 方法得到 Field[],也就是类的属性列表,然后用 Field. getGenericType() 方法得到这个属性的 Type 类型。

  • 当我们拿到一个Method,用 Method.getGenericParameterTypes() 方法获得 Type[],也就是方法的参数类型列表。

  • 当我们拿到一个 Class,用 Class.getGenericSuperclass() 这样就可以获取父类的泛型实参列表,和 Class.getGenericInterfaces() 方法类似,这个获得的内容和 class.getSuperclass() 方法获得的内容一样;

Type的分类

Type接口包含了一个实现类 (Class) 和四个实现接口 (TypeVariable, ParameterizedType, GenericArrayType, WildcardType) ,这四个接口都有自己的实现类,但这些实现类开发都不能直接使用,只能用接口。

  • Class: 当需要描述的类型是普通 Java 类、数组、自定义类、 8种java基本类型的时候, java会选择Class来作为这个Type的实现类,我们甚至可以直接把这个Type强行转换类型为Class。这些类基本都有一个特点:基本和泛型无关,其他4种Type的类型,基本都是泛型的各种形态。
  • ParameterizedType: 当需要描述的类是泛型类时,比如 List,Map 等,不论代码里写没写具体的泛型,java 会选择 ParameterizedType 接口做为Type的实现。ParameterizedType 接口有 getActualTypeArguments() 方法,用于得到泛型的 Type 类型数组。
  • GenericArrayType: 当需要描述的类型是泛型类的数组时,比如比如 List[] , Map[] , type 用GenericArrayType 接口作为 Type 的实现。GenericArrayType 接口有 getGenericComponentType() 方法,得到数组的组件类型的 Type 对象。
  • WildcardType: 当需要描述的类型是泛型类,而且泛型类中的泛型被定义为 (? extends xxx) 或者 (? super xxx) 这种类型,比如 List<? extends TestReflect>,这个类型首先将由ParameterizedType 实现,当调用 ParameterizedType 的 getActualTypeArguments() 方法后得到的 Type 就由 WildcardType 实现。

示例表格如下:

描述类型举例所用到的 Type 类型
TestClass
ArrayList<String>ParameterizedType
Test<String>[]GenericArrayType
Test<? extends Father>WildcardType

使用反射创建和操作任意类型数组

在java.lang.reflect包下还提供了一个Array类,Array对象可以代表所有的数组。程序可以通过使用Array类来动态的创建数组,操作数组元素等。

相关方法

public static Object newInstance(Class<?> componentType, int… dimensions):创建一个具有指定的组件类型和维度的新数组。

public static void setXxx(Object array,int index,xxx value):将array数组中[index]元素的值修改为value。此处的Xxx对应8种基本数据类型,如果该属性的类型是引用数据类型,则直接使用set(Object array,int index, Object value)方法。

public static xxx getXxx(Object array,int index,xxx value):将array数组中[index]元素的值返回。此处的Xxx对应8种基本数据类型,如果该属性的类型是引用数据类型,则直接使用get(Object array,int index)方法。

示例如下:

package top.sharehome.Test;import java.lang.reflect.Array;public class Demo {public static void main(String[] args) {Object object = Array.newInstance(int.class, 5);Array.setInt(object,0,0);Array.setInt(object,1,1);Array.setInt(object,2,2);for (int i = 0; i < 5; i++) {System.out.println("Array.getInt(object,i) = " + Array.getInt(object, i));}}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一章:由浅到深认识Java语言(43):注解

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

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

相关文章

设计模式学习笔记 - 设计模式与范式 -结构型:8.享元模式(下):享元模式在Java Integer、String中的应用

概述 上篇文章《结构型&#xff1a;7.享元模式&#xff08;上&#xff09;&#xff1a;享元模式原理和应用》&#xff0c;通过棋牌游戏和文本编辑器的例子&#xff0c;学习了享元模式的原理、实现以及应用场景。用一句话总结下&#xff0c;享元模式中的 “享元” 指被共享的单…

这次轮到小米,遥遥领先!

年轻人的第一辆保时米 3 月28日晚小米首款汽车小米汽车 SU7 正式发布并上市&#xff0c;新车定位于“C 级高性能生态科技轿车”&#xff0c;提供双电机版本和单电机版本车型选择&#xff0c;并提供容量为 73.6 千瓦时以及 101 千瓦时电池可选&#xff0c;售价 21.59 万元-29.99…

ArcObject for Java 开发环境搭建(IDEA2021)

一、系统环境 1、JDK 需要32位JDK1.8&#xff0c;安装版或离线免安装版均可。 arcgis10.2.2使用1.8.0_151版本&#xff0c;arcgis10.7使用1.8.0_181版本&#xff0c;不过应该都可以&#xff0c;小版本没有严格区分。 2、配置环境变量 配置Arcgis环境变量&#xff08;必须&…

CXL系统架构

CXL系统架构 CXL支持三种设备类型&#xff0c;如下图。Type 1支持CXL.cache和CXL.io&#xff1b;Type 2支持CXL.cache&#xff0c;CXL.mem和CXL.io&#xff1b;Type 3支持CXL.mem和CXL.io。无论哪种类型&#xff0c;CXL.io都是不可缺少的&#xff0c;因为设备的发现&#xff0…

springcloud微服务项目,通过gateway+nacos实现灰度发布(系统不停机升级)

一、背景 灰度发布的目的是保证系统的高可用&#xff0c;不停机&#xff0c;提升用户体验。在微服务系统中&#xff0c;原有系统不下线&#xff0c;新版系统与原有系统同时在线&#xff0c;通过访问权重在线实时配置&#xff0c;可以让少量用户先应用新版本功能&#xff0c;如…

JavaSE day14笔记

第十四天课堂笔记 课上: 适当做笔记课下 : 总结 , 读代码 , 反复敲代码 , 做练习 数组★★★ 数组 : 存储多个 同一类型 的容器格式 :数组类型 : 引用数据类型, new运算符在堆中 分配一块连续的存储空间 , 系统会给数组元素默认初始化 , 将该数组的引用赋值给数组名 引用数据…

Java中读取html文件转成String,展示在浏览器

这里写目录标题 第一章1.1&#xff09;pom中引入依赖和html文件示例1.2&#xff09;使用hutool工具包读取html文件转为string1.3&#xff09;页面显示 第一章 1.1&#xff09;pom中引入依赖和html文件示例 引入hutool工具包依赖 <dependency><groupId>cn.hutool&…

mongodb sharding分片模式的集群数据库,日志治理缺失导致写入数据库报错MongoWriteConcernException的问题总结(上)

一、背景 常见的mongodb集群模式有以下三种&#xff1a; 主从复制&#xff08;Master-Slave&#xff09;模式副本集&#xff08;Replica Set&#xff09;模式分片&#xff08;Sharding&#xff09;模式 公司测试环境搭建的集群采用分片模式&#xff0c;有同事反馈说&#xf…

Qt打印系统库的日志 - QLoggingCategory

Qt的动态库通过源码可以可以看到含有大量的qCInfo 和 qCDebug 等大量的日志&#xff0c; 但是我们正常运行Qt程序&#xff0c;这些动态库或插件里面的日志是不会输出到我们的控制台里面的。 所以本章主要记录怎么输出这些日志出来。 一&#xff1a; 步骤 主要使用的是Qt的 函…

ABA分析方法 — 软硬件开发必备的一种分析问题绝佳套路

ABA分析方法 “决定我们看到什么&#xff0c;并且看到什么方式的是我们的思维方式。” — 乔治奥威尔 更多精彩内容&#xff0c;请关注公众号《机器灵魂注入师》。 什么是ABA分析方法&#xff1f; 可能你从很多地方听过这个名词&#xff0c;无论是在软件开发还是硬件领域(比较…

单片机之串口通信

目录 串口介绍 通信的基本概念 并行通信和串行通信 同步通信和异步通信 串行异步通信方式 串行同步通信方式 通信协议 单片机常见通信接口 串行通信三种模式 串口参数 传输速度 ​串口的连接 电平标准 串行口的组成 串口数据缓冲寄存器 串行口控制寄存器 串口…

HarmonyOS入门--配置环境 + IDE汉化

文章目录 下载安装DevEco Studio配置环境先认识DevEco Studio界面工程目录工程级目录模块级目录 app.json5module.json5main_pages.json通知栏预览区 运行模拟器IED汉化 下载安装DevEco Studio 去官网下载DevEco Studio完了安装 配置环境 打开已安装的DevEco Studio快捷方式…

33.HarmonyOS App(JAVA)鸿蒙系统app数据库增删改查

33.HarmonyOS App(JAVA)鸿蒙系统app数据库增删改查 关系数据库 关系对象数据库&#xff08;ORM&#xff09; 应用偏好数据库 分布式数据库 关系型数据库&#xff08;Relational Database&#xff0c;RDB&#xff09;是一种基于关系模型来管理数据的数据库。HarmonyOS关系型…

阿里云Salesforce CRM功能差异列表 - Winter‘ 24

阉割版的阿里云Salesforce由于技术和监管等因素与国际版的Salesforce差距很大&#xff01; 一、Winter‘ 24版差异概况&#xff1a; 1.1. 主要版本&#xff1a; 阿里云上的 Salesforce 提供两个版本&#xff0c;用于生产用途的 CN 版本&#xff08;CN Edition&#xff09;和用…

NineData与StarRocks商业化运营公司镜舟科技完成产品兼容认证

近日&#xff0c;镜舟科技与NineData完成产品兼容测试。在经过联合测试后&#xff0c;镜舟科技旗下产品与NineData云原生智能数据管理平台完全兼容&#xff0c;整体运行高效稳定。 镜舟科技致力于帮助中国企业构建卓越的数据分析系统&#xff0c;打造独具竞争力的“数据护城河”…

乐维更改IP地址

1.1 系统IP调整 vim /etc/sysconfig/network-scripts/ifcfg-ens1921.2 Web相关服务IP变更 1.2.1 编辑/itops/nginx/html/lwjkapp/.env文件,更改ZABBIXSERVER、ZABBIXRPCURL、DB_HOST中的IP 1.2.2 进入/itops/nginx/html/lwjk_app/目录下,执行php bin/manager process-conso…

VMware虚拟机更换引导顺序

前言 我用wmware装了黑群晖测试&#xff0c;将img转成vmdisk的格式之后发现系统引导盘之后1G&#xff0c;有点太小了 我准备把wmware的黑群晖系统迁移到新添加的虚拟磁盘里 1.登录黑群晖的SSH 请先在黑群晖的控制面板中的终端机和SNMP里面启用SSH功能&#xff0c;才能使用ss…

原创度检测工具分享,文章质量检测方便又简单

文章检测有利于我们了解文章内容的质量高低&#xff0c;而在以往我们检测文章只能依靠手动去检测&#xff0c;这是相当消耗工作时间的&#xff0c;但是在原创度检测工具出来之后&#xff0c;很多人开始检测文章质量就改用原创度检测工具了&#xff0c;因为使用原创度检测工具是…

睿尔曼超轻量仿人机械臂之复合机器人底盘介绍及接口调用

机器人移动平台是一个包含完整成熟的感知、认知和定位导航能力的轮式机器人底盘产品级平台&#xff0c;产品致力于为各行业细分市场的商用轮式服务机器人提供一站式移动机器人解决方案&#xff0c;让合作伙伴专注在核心业务/人机交互的实现。以下是我司产品双臂机器人以及复合升…

亚马逊云科技如何看待云计算产业在硬件方面的创新趋势

“真正认真对待软件的人应该制造自己的硬件。” 这是被称为个人电脑之父的艾伦凯博士的一句广为流传的言论。 这种趋势正在云计算行业发生。 目前&#xff0c;全球主流云计算厂商均已加入自研芯片的行列。 如果追溯这一趋势的发展&#xff0c;亚马逊云技术无疑是领先者。 在r…