Java 反射深入浅出

news2024/9/29 23:36:19

Java 反射深入浅出📈

反射的概述:📑

Java Reflection(反射) 被视为动态语言的关键,Java并不是动态语言,但因为反射Java可以被称为准动态语言

反射机制允许程序在执行期 借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内 部属性及方法。反射是框架的灵魂

  • 我们都知道Java 程序在加载完之后,在堆内存的方法区中就产生了一个Class类型的对象一个类只有一个Class对象,这个对象包含了整个类的结构信息,可以通过这个对象看到类的结构。
  • 这个对象就像 照镜子 一样,反射 出类的信息。

动态语言

是一类在运行时可以改变其结构的语言:

例如新的函数、对象、甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运 行时代码可以根据某些条件改变自身结构。

主要动态语言: Object-C、C#、JavaScript、PHP、Python、Erlang

静态语言

与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、 C++。

反射的入门案例:

上面说了这么多其实还是有点模模糊糊,归根结底,反射也就是Java中的一组API,常用的类有:

  • Java.lang.Class:代表一个类的字节码文件。注意并不是小写的class 关键字而是一个类,可以理解为是类的类。
  • Java.lang.reflect.Field:代表类的成员变量
  • Java.lang.reflect.Method:代表类中的方法
  • Java.lang.reflect.Constructor:代表类的构造器

环境搭建:

在这里插入图片描述
定义 Person

//创建一个人的类
public class Person {
    //姓名
    public String name;
    //年龄: 因为有点人的年龄是保密的,
    private int age;
    //无参公共构造函数
    public Person(){   }
    //有参私有构造函数
    private Person(String name, int age) { this.name = name; this.age = age; }
    //定义方法
    //说话表达,人都可以说话表达这个是公开说出来的
    public void speak(){ System.out.println(name+"表达说出自己的话");    }
    //心想思考,这个过程是内心活动是私有的
    private void think(){ System.out.println(name+"在内心在思考,晚上吃什么^^");    }
    //省略封装的toString/get/set方法...
}    

Deom实例:

创建Person的类对象,并调用属性方法,正常的Java操作:

Java创建对象:

//Java创建对象并使用:
@Test
public void common(){
    //创建对象
    Person person = new Person();
    //属性赋值并输出...
    person.setName("张三");
    person.speak();
    System.out.println("我叫:"+person.name+"今年:"+person.getAge());    //私有的属性被封装仅可通过公共get/set方法操作.
    //正常情况Java在类的外部不可以调用私有属性、方法、构造
}

在这里插入图片描述

Java反射创建对象:

//通过反射机制创建对象并使用:
@Test
public void reflection() throws Exception{
    //1.反射创建对象
    //通过Person类.class 获取一个Class对象,并通过getConstructor()获取其Public构造对象创建对象.
    Class<Person> personClass = Person.class;
    Constructor<Person> constructor = personClass.getConstructor();      //方法需要捕获/抛出异常:NoSuchMethodException
    Person person = constructor.newInstance();                           //这里的参数需要和上面getConstructor() 定义时一只不然会抛出IllegalAccessException类型转换异常.
    person.setName("张三");
    System.out.println("我叫:"+person.name+"今年:"+person.getAge());     //反射创建的对象并调用属性方法,因为Java的封装性任然不能调用私有的方法;

    //2.通过反射调用类的Public属性,并更改对象的name属性
    Field nameField = personClass.getDeclaredField("name");
    nameField.set(person,"李四");
    System.out.println("我叫:"+person.name);

    //3.通过反射调用类的Public方法
    Method speak = personClass.getDeclaredMethod("speak");
    speak.invoke(person);

    //-------------目前使用反射做到和反射钱一样的操作,但是反射更加强大它可以调用类的Private私有构造/方法/属性
    System.out.println("使用反射调用私有构造/属性/方法");
    //1.通过反射可以调用私有构造器
    Constructor<Person> declaredConstructor = personClass.getDeclaredConstructor(String.class, int.class);
    declaredConstructor.setAccessible(true);
    Person person1 = declaredConstructor.newInstance("王五", 10);
    System.out.println("我叫:"+person1.name+"今年:"+person1.getAge());    //通过反射调用私有的构造完成了对象实例化操作.
    //2.通过反射调用私有的属性
    Field ageField = personClass.getDeclaredField("age");
    ageField.setAccessible(true);
    ageField.set(person1,20);
    System.out.println("我叫:"+person1.name+"今年:"+person1.getAge());   //通过反射调用私有的属性并重新赋值.
    //3.通过反射调用私有的方法
    Method thinkMethod = personClass.getDeclaredMethod("think");    	//通过反射调用私有的方法
    thinkMethod.setAccessible(true);
    thinkMethod.invoke(person1);                                        //invoke(需要被调用方法类的对象);
}

在这里插入图片描述

好的,通过上面的基础方法,大概了解了反射的基本使用: 反射机制允许程序在执行期 借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内 部属性及方法。

反射核心 Class类

Java.lang.Class类:

Class类是一个特殊类本质也是一个类,它用于表示JVM运行时类或接口的信息

Class 对象只能由系统建立对象,一个加载的类在 JVM 中只会有一个Class实例,Class对象对应的是一个加载到JVM中的一个.class文件

每个类的实例都会记得自己是由哪个 Class 实例所生成,通过Class可以完整地得到一个类中的所有被加载的结构,Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的 Class对象。

Java类加载简单过程:

这里只是简单了解一个大概的过程,其内部的原理更加复杂…

在这里插入图片描述

创建Class类的对象四种方法

  • 调用运行时类的 .class属性

  • 通过运行时类的对象,调用.getClass()方法;

  • 使用类加载器,ClassLoader进行创建Class对象

  • 通过Class类的静态方法 forName(“全类名”); 的形式进行调用。✨最常用

  • 通过Class类的静态方法 forName(“全类名”); 的形式进行调用。✨最常用

//Class 对象创建的几种方式:使用Person类举例
public class CreateClass {
    public static void main(String[] args) throws ClassNotFoundException {
        //方式一:调用运行时类的 .class属性.
        Class<Person> class1 = Person.class;

        //方式二;通过运行时类的对象,调用.getClass()方法;
        Person person = new Person();
        Class<? extends Person> class2 = person.getClass();         //此种方法并不常用因为已经获取到了类的对象就可以完成大部分的操作了没必要多此一举了.

        //方式三: 通过Class类的静态方法 forName(“全类名”); 的形式进行调用
        //方法需要声明异常 ClassNotFoundException,也是最常用的方法,因为很多时候,我们都是不能确定要创建什么类的时候而这种方法可以通过传参自定义创建的对象,使程序具有动态性。
        Class class3 = Class.forName("com.wsm.begin.Person");

        //方式四:使用类加载器,ClassLoader进行创建Class对象
        //这种方法有点了离谱先通过Class对象获取 ClassLoader类加载器在去获取其他 Class对象;
        ClassLoader classLoader = CreateClass.class.getClassLoader();
        Class<?> class4 = classLoader.loadClass("com.wsm.begin.Person");

        //上面说每个类在加载到JVM中时候只有一个对应的Class,所以这四种创建Person Class对象,的对象值其实都是用的同一块内存空间地址.
        System.out.println(class1==class2 && class3==class4);   //结果是:True
    }
}

哪些类型可以有Class对象?

Java中,基本上任何对象属性都存在 Class对象,基于面向对象的原则万事万物皆是对象。

外部类、内部类、静态内部类、interface接口、数组、enum枚举、@annotation注解、基本数据类型、void…都存在Class对象。

//Java中那些类型存在Class的对象.
//Java中万事万物皆对象,只要可以是对象就都有Class对象.
@Test
public void allClass(){
    Class c1 = Object.class;        //Object类中存在 .getClass(); 所以所有的方法都可以通过改方法获取对象.
    Class c2 = Comparable.class;    //接口
    Class c3 = String[].class;      //数组
    Class c4 = int[][].class;       //多维数组
    Class c5 = ElementType.class;   //枚举
    Class c6 = Override.class;      //注解
    Class c7 = int.class;           //基本数据类型
    Class c8 = void.class;          //void
    Class c9 = Class.class;         //Class类本身也是底层一个Class文件.


    //注意:只要元素类型与维度一样,就是同一个Class 因为本质上在JVM都是同一个CLass文件所以结果: True
    int[] a = new int[10];
    int[] b = new int[100];
    Class c10 = a.getClass();
    Class c11 = b.getClass();
    System.out.println(c10 == c11);
}

Class类的常用方法:

方法名功能说明
static Class forName(String name)返回指定类名 name 的 Class 对象
Object newInstance()调用空参构造函数,返回该Class对象的一个实例
getName()返回此Class对象所表示的实体(类、接口、数组类、基本类型 或void)名称
Class getSuperClass()返回当前Class对象的父类的Class对象
Class [] getInterfaces()获取当前Class对象的接口
ClassLoader getClassLoader()返回该类的类加载器
Class getSuperclass()返回表示此Class所表示的实体的超类的Class
Constructor[] getConstructors()返回一个包含某些Constructor对象的数组
Field[] getDeclaredFields()返回Field对象的一个数组
Method getMethod(String name,Class … paramTypes)返回一个Method对象,此对象的形参类型为paramType

获取运行时类的运行状态:

环境准备

定义一个子类,继承父类,实现接口,私有|共有的构造函数,私有|共有属性、方法、注解…

自定义一个注解类:MyAnnotation

//自定义注解类
@Retention(RetentionPolicy.RUNTIME)					//一种元注解: 标识注解的执行生命周期,只有是运行时的注解才可以被反射使用.
public @interface MyAnnotation {
    //这是自定义注解中,属性的声明方式: 数据类型 参数名;
    String value() default "wsm";                   /** 如果只有一个参数成员,建议使用参数名为value */
}

生物类Creature

public class Creature<T> implements Serializable { //实现序列化的接口
    //共有属性: 性别
    public String sex;
    //私有属性:年龄
    private int age;

    //公共|私有方法
    public void eat(){ System.out.println("吃饭了..."); }
    private void slepp(){ System.out.println("吃饱了,睡觉..."); }

    //Java默认类具有一个无参的构造...
    //省略封装的toString/get/set方法...
}

人类Person

public class Person extends Creature<String> implements Comparable{     //注意这里的父类带泛型<String>
    //共有属性:姓名
    public String name;
    //私有属性:学历
    private String education;

    //公共|私有构造
    public Person (){ System.out.println("无参构造执行..."); }
    private Person(String name, String education) { this.name = name; this.education = education; }

    //公共|私有方法
    //说话表达,人都可以说话表达这个是公开说出来的
    public void speak(){ System.out.println(name+"表达说出自己的话");    }
    //心想思考,这个过程是内心活动是私有的,方法具有:注解 访问修饰符 返回值 声明的异常...都可以通过反射获取.
    @MyAnnotation
    private String think() throws RuntimeException,IllegalAccessError { return  "在内心在思考,晚上吃什么^^";   }
    //重写Comparable Java比较器的方法.
    @Override
    public int compareTo(Object o) { return 0; }
    //省略封装的toString/get/set方法...
}

反射操作运行时类:

Class对象的newInstance()方法👍

使用反射最常用创建对象的方法 newInstance();,该方法本质是调用,类的无参构造进行创建对象。所以需要一些硬性要求:

  • 类必须有一个无参数的构造器。
  • 类的构造器的访问权限需要足够。
//反射操作运行时类对象Test1
@Test
public void fsTest1() throws Exception{
    //使用Class类的静态方法forName(”全类名“); 获取对应的Class对象
    Class<Person> classP = (Class<Person>) Class.forName("com.wsm.reflection.study.Person");   //方法需要抛出异常因为可能存在全类名不存在的类.
    Person person = classP.newInstance();    //方法需要抛出异常因为可能存在类的构造函数不存在的情况.
}

获取运行时类的结构:

获取运行时类的结构:父类,实现的接口,获取类的全类名,接口调用构造完成实例化

  • getSuperclass(); 获取父类的Class对象
  • getInterfaces(); 获取类实现的所有接口,反击一个Class[]
  • getTypeName(); 获取Class的全类名
  • getConstructor(...);|getDeclaredConstructor(...); (…)表示一个动态长度的参数数组,
    • 分别表示获取当前Class的仅Public的构造函数。并调用 newInstance(...);进行初始化操作。
    • getModifiers();返回的值是int类型:什么都不加是0 , public 是1 ,private 是 2 ,protected 是 4,static 是 8 ,final 是 16、
    • getParameterTypes(); 返回参数列表的数组
    • getName();获取方法的名称;
  • getGenericSuperclass(); 获取带泛型的父类,如果父类没有泛型则获取不到 Type类型
    • ParameterizedType 泛型类型的对象,getActualTypeArguments(); 获取泛型对象的数组。
  • setAccessible(boolean); Method和Field、Constructor对象都有setAccessible()方法;
    • setAccessible启动和禁用访问安全检查的开关,参数值为true则指示反射的对象在使用时应该取消Java语言访问检查即可以使用Private的属性方法构造
//获取运行时类的结构:父类,实现的接口,获取类的全类名,接口调用构造完成实例化.
@Test
public void runClassStructure() throws Exception {
    Class<Person> classP = (Class<Person>) Class.forName("com.wsm.reflection.study.Person");
    //获取其父类Class对象
    Class<? super Person> superclass = classP.getSuperclass();
    //获取接口
    Class<?>[] classPInterfaces = classP.getInterfaces();       //返回一个数组因为一个类可以实现多个接口;
    //获取子类|父类|接口类的全类名:
    System.out.println("子类全类名:"+classP.getTypeName());
    System.out.println("父类全类名:"+superclass.getTypeName());
    System.out.println("接口类全类名:"+classPInterfaces[0].getTypeName());  //因为子类仅有一个接口就直接[0],当然可以考虑不存在的情况...
    
    //获取带泛型的父类的泛型:
    //getGenericSuperclass(); 如果父类没有泛型则不会获取;
    Type genericSuperclass = classP.getGenericSuperclass();
    ParameterizedType paramtype = (ParameterizedType) genericSuperclass;
    System.out.println("获取带泛型的父类:"+genericSuperclass);
    System.out.println("获取带泛型的父类的泛型的类型:"+paramtype.getActualTypeArguments()[0]);   //返回一个数组,因为类的泛型可以是多个比如:MAP<k,v>
    
    //获取子类的Public构造方法创建对象
    //正常情况下构建对象直接使用 newInstance(); 即可, getConstructor():获取该类的Public的构造方法,并根据参数进行实例化;
    Constructor<Person> constructor = classP.getConstructor();
    Person person = constructor.newInstance();  //这里的newInstance方法的参数要和 classP.getConstructor() 一致不然会报错;
    System.out.println(person);

    //获取子类的Public和Private构造方法创建对象
    Constructor<Person> constructor1 = classP.getDeclaredConstructor(String.class, String.class);
    constructor1.setAccessible(true);   //如果调用private的方法|构造需要将启动和禁用访问安全检查的开关设为 True
    Person person1 = constructor1.newInstance("wsm", "大专");
    System.out.println(person1);
    //获取构造函数的修饰符 方法名称 参数列表(因为这里知道有两个参数就写死了,方法返回的是一个数组)
    System.out.println("Person的有参构造的访问修饰符:"+constructor1.getModifiers()+",方法名称:"+constructor1.getName()+",参数类型列表:"+constructor1.getParameterTypes()[0]+","+constructor1.getParameterTypes()[1]);
}

获取运行时类的方法Method:

  • getMethods(); 获取子类和父类Public的方法。

  • getDeclaredMethods 获取子类Public和Private的方法。

  • getMethod();|getDeclaredMethod(); 根据方法名指定获取仅共有包含父类|仅当前类但包含共有私有的方法。

    • setAccessible(boolean) 获取私有的方法需要,设置true开通访问权限。

    • Object invoke(Object obj,Object... args); 相当于代替obj对象调用指定的方法的方法,返回值Object类型,若原方法无返回值,此时返回null

      若原方法若为static静态方法,此时形参Object obj可为null

      若原方法形参列表为空,则Object[] args为null,可以不填

      若原方法声明为private,则需要在调用此invoke()方法前,显式调用 方法对象的setAccessible(true)方法,将可访问private的方法

获取方法的具体信息:

  • getModifiers(); 获取方法权限修饰符
  • getReturnType(); 获取方法的返回值
  • getParameterTypes(); 获取方法的参数列表,返回一个数组;
  • getExceptionTypes(); 获取方法抛出的异常,返回一个异常数组;
//获取运行时类的结构方法:
@Test
public void runClassStructureMethod() throws Exception {
    Class<Person> classP = (Class<Person>) Class.forName("com.wsm.reflection.study.Person");
    System.out.println("获取子类父类的所有Public方法,包含Object类");
    Method[] methods = classP.getMethods();
    for (Method method : methods) { System.out.println(method); }

    System.out.println("获取当前Class Public和Private方法,这个不会包含父类");  //如果想要父类的私有方法可以通过 getSuperclass() 先获取父类Class
    Method[] declaredMethods = classP.getDeclaredMethods();
    for (Method method : declaredMethods) { System.out.println(method); }

    //上面获取方法都是返回一个数组,反射中也存在单独获取某一个类的操作:getMethod("指定方法名");|getDeclaredMethod("指定方法名"); 和上面大概相同Public和Private的区别;
    Person person = classP.newInstance();
    Method thinkMethod = classP.getDeclaredMethod("think");
    thinkMethod.setAccessible(true);
    System.out.println("调用方法 invoke(执行方法的对象,...方法的多参属性...) 如果方法存在返回值则也通过 invoke()方法返回;");
    Object invoke = thinkMethod.invoke(person);
    System.out.println("Person的think方法返回值:"+invoke);
    //获取方法的具体信息:
    System.out.println("取得权限修饰符: "+thinkMethod.getModifiers());
    System.out.println("取得方法的返回值: "+thinkMethod.getReturnType());
    System.out.println("取得全部的参数: "+thinkMethod.getParameterTypes()+"返回一个参数数组地址值");
    System.out.println("取得方法抛出的异常信息: "+thinkMethod.getExceptionTypes()[0]+","+thinkMethod.getExceptionTypes()[1]+"返回一个参数数组地址值");

    //扩展:获取注解
    //getAnnotations(); 获取改方法的所有RUNTIME注解数组[],包含父类的注解,因为这个是方法所以不方便展示;
    //getDeclaredAnnotations(); 仅获取子类的注解;
    Annotation[] annotations = thinkMethod.getAnnotations();
    System.out.println(annotations[0]);
}

获取运行时类的属性Field:

这里的方法和类和上面也都类似就不详细介绍了: Field类的常用方法;

  • Object get(Object obj); 取得指定对象obj上此Field的属性内容
  • set(Object obj,Object value); 设置指定对象obj上此Field的属性内容 obj指要修改的对象 vlaue指要修改的值;
//获取运行时类的结构属性:
@Test
public void runClassStructureField() throws Exception {
    Class<Person> classP = (Class<Person>) Class.forName("com.wsm.reflection.study.Person");
    System.out.println("获取子类父类的所有Public属性,包含Object类");
    Field[] fields = classP.getFields();
    for (Field field : fields) { System.out.println(field); }

    System.out.println("获取当前Class Public和Private属性,这个不会包含父类");  //如果想要父类的私有属性可以通过 getSuperclass() 先获取父类Class
    Field[] declaredField = classP.getDeclaredFields();
    for (Field field : declaredField) { System.out.println(field); }

    //上面获取方法都是返回一个数组,反射中也存在单独获取某一个类的操作:getFields("指定属性名");|getDeclaredFields("指定属性名"); 和上面大概相同Public和Private的区别;
    Person person = classP.newInstance();
    Field field = classP.getDeclaredField("education");
    field.setAccessible(true);
    //设置person的属性
    field.set(person,"本科");
    System.out.println("person的学历是:"+field.get(person));
}

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

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

相关文章

哪款蓝牙耳机性价比最高?无线蓝牙耳机性价比排行榜

我酷爱音乐&#xff0c;也是游戏发烧友&#xff0c;平时耳机从不离身。用的耳机多了&#xff0c;在选择上也有了自己的一些心得&#xff0c;通常来说&#xff0c;音乐耳机注重音效&#xff0c;游戏耳机注重低延迟&#xff0c;当前蓝牙耳机市场琳琅满目&#xff0c;下面推荐以下…

100M网口客户电脑插上网线就断线,自己工厂正常,是什么问题导致?

Hqst&#xff08;华强盛科技&#xff09;导读&#xff1a;物联工程师100M网口产品出现客户电脑插上网线就显示断线&#xff0c;无法通信&#xff0c;在自己工厂又正常使用&#xff0c;是什么问题&#xff1f;问&#xff1a;100M 网口&#xff0c; 使用改电路&#xff0c; 产品出…

Learning C++ No.10【STL No.2】

引言&#xff1a; 北京时间&#xff1a;2023/2/14/23:18&#xff0c;放假两个月&#xff0c;没有锻炼&#xff0c;今天去跑了几圈&#xff0c;一个字&#xff0c;累&#xff0c;感觉人都要原地升天了&#xff0c;所以各位小伙伴&#xff0c;准确的说是各位卷王&#xff0c;一定…

与其被行业内卷,还不如主动出击,打破困境~

如今的 “互联行业内卷”这事好像成为了一种常态&#xff0c;尤其是在一些已处于饱和状态和即将处于饱和状态的行业比较突出&#xff0c;比如&#xff1a;Android 开发行业、前端、……等等 造成行业内卷原因是什么&#xff1f; 市场竞争加剧&#xff0c;企业更加注重成本控制…

大数据---Hadoop集群搭建

Hadoop集群搭建 再起启动一台虚拟机并且安装jdk&#xff0c;开启免密登录 不需要安装zookeeper 文章目录Hadoop集群搭建时间同步4台机器安装npdate设置定时任务集群配置图将Hadoop安装包上传到zk1zk1---解压到soft目录下zk1---更名zk1---修改配置文件core-site.xmlhdfs-site.x…

第四届宁波网安市赛训练题

Crypto 散乱的密文 8fd4a4c94gf15{50}l72d3提示了2 1 6 5 3 4&#xff0c;我们直接横向排列 2165348fd4a4c94gf15{50}l72d3 按顺序竖着抄下来fc1l84f}a45dg034{2d957,然后栅栏解密&#xff0c;注意这里是W型栅栏解密&#xff0c;行数6 flag:flag{52048c453d794df1} 综合解密…

stm32f429FMC外设学习

功能框图 这是一种型号为 W9825G6KH 的 SDRAM 芯片内部结构框图&#xff0c;以它为模型进行学习 CLK -- FMC_SDCLK //同步时钟信号 CKE -- FMC_SDCKE[1:0] //SDCKE0&#xff1a; SDRAM 存储区域 1 时钟使能,;SDCKE1&#xff1a; SDRAM 存储区域 2 时钟使能.这里表示的…

QT(16)- QFileDevice

QT&#xff08;16&#xff09;- QFileDevice1 简介2 公有类型2.1 enum QFileDevice::FileError2.2 enum QFileDevice&#xff1a;&#xff1a;FileHandleFlag2.3 enum QFileDevice::FileTime2.4 enum QFileDevice&#xff1a;&#xff1a;MemoryMapFlags2.5 enum QFileDevice::…

【OJ】计数的梦

&#x1f4da;Description: Bessie 处于半梦半醒的状态。过了一会儿&#xff0c;她意识到她好像在数羊&#xff0c;不能入睡。Bessie的大脑反应灵敏&#xff0c;仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码&#xff1a;每一个数码在计数的过程中出现过多少次…

华为OD机试 - 箱子之形摆放(Python)| 真题+思路+考点+代码+岗位

箱子之形摆放 题目 有一批箱子(形式为字符串,设为str), 要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地,请输出箱子的摆放位置。 例如:箱子ABCDEFG,空地宽度为3,摆放结果如图: 则输出结果为: AFG BE CD 输入 输入一行字符串,通过空格分隔,前面部…

关于tensorboard --logdir=logs的报错解决办法记录

我在运行tensorboard --logdirlogs时&#xff0c;产生了如下的报错&#xff0c;找遍全网后&#xff0c;解决办法如下 先卸载 pip uninstall tensorboard再安装 pip install tensorboard最后出现如下报错 Traceback (most recent call last): File “d:\newanaconda\envs\imo…

华为3面,官网显示面试通过了...开始泡池子,进入漫长等待期

背景&#xff1a; 现在双非本科&#xff0c;非计算机科班&#xff0c;有算法方面的奖&#xff0c;有嵌入式开发经历&#xff0c;官网显示面试通过&#xff0c;短信说录用情况在十个工作日内告知&#xff0c;看别人的说法应该是泡池子了。 全程视频面试&#xff0c;一天面完三…

[ Azure - IAM ] Azure 中的基于角色的访问控制 (RBAC) 与基于属性的访问控制 (ABAC)

在任何公司中&#xff0c;网络用户必须先经过身份验证和授权&#xff0c;然后才能访问可能导致安全漏洞的系统部分。获得授权的过程称为访问控制。在本文中&#xff0c;我将讨论管理系统访问控制的两种主要方法——基于角色的访问控制 (RBAC)和基于属性的访问控制 (ABAC) &…

春招Leetcode刷题日记-D3-双指针算法-归并两个有序数组Two Sum

D3-双指针算法-归并两个有序数组&&Two Sum什么是双指针算法力扣88. 合并两个有序数组思路代码力扣167. 两数之和 II - 输入有序数组思路思路一&#xff1a;时间复杂度O(nlogn&#xff09;算法代码思路二&#xff1a;时间复杂度O(n)--双指针算法代码什么是双指针算法 1…

c++学习笔记-案例-职工管理系统(哔站-黑马程序员c++教学视频)

目录 一、需求分析 1、职工管理系统需求 2、管理系统中需要实现的功能 3、系统界面如下&#xff1a; 二、代码实现 1、整体结构 2、具体分析 &#xff08;1&#xff09;创建01workerManager.h &#xff08;2&#xff09;创建02worker.h &#xff08;3&#xff09;创建…

秒杀项目的消息推送

目录 一、创建消费者 二、创建订单链路配置 1.定义RabbitMQ配置类 2.创建RabbitmqOrderConfig配置类 三、如何实现RabbitMQ重复投递机制 1.开启发送者消息确认模式 2.消息发送确认 ① 创建ConfirmCallBacker确认模式 ② 创建ReturnCallBack退回模式 3.创建生产者 …

*1创建 Vue3

1、使用 vue-cli 进行创建 &#xff08;1&#xff09;查看 vue-cli 版本,确保 vue-cli 版本在4.5.0上 win键 r &#xff0c;输入cmd ——>输入 vue -V 若低于4.5.0版本&#xff0c;则需要重新安装 npm i -g vue/cli &#xff08;2&#xff09;在桌面创建项目&#xff08;也…

天荒地老修仙功-第七部:Dubbo基本使用与原理详解

文章目录一、基础知识1、分布式基础理论1.1、什么是分布式系统&#xff1f;1.2、发展演变1.2.1 单一应用架构1.2.2 垂直应用架构1.2.4 分布式服务架构1.2.4 流动计算架构1.3、RPC2、dubbo核心概念2.1、简介2.2、基本概念2.2.1 服务提供者&#xff08;Provider&#xff09;2.2.2…

ViewBinding使用入门

ViewBinding 参考资料: 新技术 ViewBinding 最佳实践 & 原理击穿 更多 ViewBinding 的封装思路 1. kotlin-android-extensions(KAE) 的问题 根据Google官方的说法, KAE存在以下问题: 污染全局命名空间不能暴露可空性信息仅支持Kotlin代码 kotlin在1.4.20中 开始废弃这…

广州暨大港澳子弟学校小学部IB探究

作为IB世界会员学校的一员&#xff0c;培养学生成为具有国际情怀的人&#xff0c;承认人类共有的博爱精神&#xff0c;分担守护地球的责任&#xff0c;帮助开创一个更好、更和平的世界而努力是广州暨大港澳子弟学校&#xff08;ASJ&#xff09;的教育使命和目标。 ASJ在PYP项目…