注解和反射

2023-11-06

一、注解

1、什么是注解?

​ 注解说白了就是对程序做出解释,与我们在方法、类上的注释没有区别,但是注解可以被其他程序所读取,进行信息处理,否则与注释没有太大的区别。

2.内置注解

​ 内置注解就是我们的jdk所带的一些注解。常用的三个注解:

  • @Override 重写方法的注解(接口和继承中)

  • @Deprecated 废弃注解 。这个注释可以修辞方法,属性,类,表示不鼓励程序员使用这样的元素,通常是因为他很危险或有更好的选择。

    public class TestDemo {
        public static void main(String[] args) {
            testDeprecated();  //中间会有横线
        }
        @Deprecated
        public static void testDeprecated(){
            System.out.println("这是一个过时的方法");
        }
    }
    
  • @SuperWarnings 这个注解主要是用来抑制警告信息的,我们在写程序时,可能会报很多黄线的警告,但是不影响运行,我们就可以用这个注解来抑制隐藏它。与前俩个注解不同的是我们必须给注解参数才能正确使用他。

    参数 说明
    deprecation 使用了过时的类或方法的警告
    unchecked 执行了未检查的转换时的警告 如:使用集合时未指定泛型
    fallthrough 当在switch语句使用时发生case穿透
    path 在类路径、源文件路径中有不存在路径的警告
    serial 当在序列化的类上缺少serialVersionUID定义时的警告
    finally 任何finally子句不能完成时的警告
    all 关于以上所有的警告

    上表中就是@SuperWarnings注解的一些参数,按需使用即可。

    3.自定义注解

    格式:public @interface 注解名 { 定义体 }
    
    • 使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口
    • 其中的每一个方法实际上是声明了一个配置参数
    • 方法的名称就是参数的名称
    • 返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)
    • 可以通过default来声明参数的默认值
    • 如果只有一个参数成员,一般参数名为value
    • 我们在使用注解元素时必须要有值,可以定义默认值,空字符串,0或者-1
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    //参数默认为空
    String value() default "";
}

4.元注解

 我们在自定义注解时,需要使用java提供的元注解,就是负责注解的其他注解。java定义了四个标准的meta-annotation类型,他们被用来提供对其他注解类型声明。
  • @Target

    这个注解的作用主要是用来描述注解的使用范围,说白了就是我们自己定义的注解可以使用在哪个地方。

所修饰范围 取值ElementType
package 包 PACKAGE
类、接口、枚举、Annotation类型 TYPE
构造器 CONSTRUCTOR
类型成员(方法,构造方法,成员变量,枚举值) FIELD
用于描述方法 METHOD
描述局部变量 LOCAL_VARIABLE
描述参数 PARAMETER

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zPPXDmDi-1669042421222)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1667313476813.png)]

我们在来测试一下这个注解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JakYxPV9-1669042421223)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1667313566473.png)]
结果显而易见,当我们将注解放在我们的变量时,编译器给我们报了一个错,翻译过来的意思就是这个注解不被允许放在这里。而放在方法上就可以安静的放在那里。

  • @Retention

    这个注解的作用就是我们需要告诉编译器我们需要在什么级别保存该注释信息,用于描述注解的生命周期。

    取值RetentionPolicy 作用
    SOURCE 在源文件中有效(即源文件保留)
    CLASS 在class文件中有效(即class保留)
    RUNTIME 在运行时有效(即运行时保留)注:为RUNTIME时可以被反射机制所读取

    在一般情况下我们使用RUNTIME即可。这样在程序运行时我们也可以通过反射机制来读取到该注解。

    @Document  //是java在生成文档,是否显示注解的开关
    @Inherited   //如果一个类用上了@Inherited修饰的注解,那么其子类也会继承这个注解
    

    上面俩个注解我们使用的就不算很多,我们一会可以通过反射机制读取到我们的注解。

二、反射(Reflect)

1、什么是反射?

==反射指的是我们可以在运行期间加载、探知、使用编译期间完全未知的类==。是一个动态的机制,允许我们通过字符串来指挥程序实例化,操作属性、调用方法。使得代码提高了灵活性,但是同时也带来了更多的资源开销。
加载完类之后,在堆内存中,就产生了一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象就包含了完整的类的结构信息。 我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过 这个镜子看到类的结构,所以,我们形象的称之为:反射。

2、class类

​ 我们在使用反射时,需要先获得我们需要的类,而java.lang.Class这个类必不可少,他十分特殊,用来表示java中类型 (class/interface/enum/annotation/primitive type/void)本身。

  • Class类的对象包含了某个被加载类的结构。一个被加载的类对应一个 Class对象。
  • 当一个class被加载,或当加载器(class loader)的defineClass()被 JVM调用,JVM 便自动产生一个Class 对象。

我们应该如何获取Class类的对象?

我们先创建一个普通的实体类。

public class Student {
    private String name;
    public Integer age;
	
    public Student() {
    }

  
    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

①、 通过Class.forName()获取(最常用)

public class TestDemo {
    public static void main(String[] args) {

        try {
            //获取Student的Class对象,参数为需要获取类对象的全类名
            Class c1 = Class.forName("Student");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

②、 通过getClass()获取

public class TestDemo {
    public static void main(String[] args) {
        //new一个student对象
        Student student = new Student();
        //通过student对象来获取student类对象
        Class c1 = student.getClass();
    }
}

③、 通过.class获取

public class TestDemo {
    public static void main(String[] args) {
        //通过导包获取类名点class来获取类对象
        Class c1 = Student.class;
    }
}

3、反射的基本操作

我们获取到Class对象后,可以获取该类的某些信息。在这里我们来看一些常用的。

①获取类名

public class TestDemo {
    public static void main(String[] args) {
        try {
            Class c1 = Class.forName("Student");
            //获取全类名
            String name = c1.getName();
            //获取简单的类名
            String simpleName = c1.getSimpleName();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

②、获取类的字段、某些变量

注意:我们仔细看注释,不带Declared的方法职能获取到public字段,且包括父类的,带Declared的方法可以获取到所有的自定义的字段!

public class TestDemo {
    public static void main(String[] args) {
        try {
            Class c1 = Class.forName("Student");
            //获取该类的所有public字段,包括父类的
            Field[] fields = c1.getFields();
            System.out.println(Arrays.toString(fields));
            //根据字段名获取该类的public字段
            Field age = c1.getField("age");
            //获取该类的所有字段,不包括父类(仅自定义)
            Field[] declaredFields = c1.getDeclaredFields();
            //根据字段名获取该类的字段
            Field name = c1.getDeclaredField("name");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}

③、获取类的方法

public class TestDemo {
    public static void main(String[] args) {
        try {
            Class c1 = Class.forName("Student");
            //获取该类的所有public方法,包括父类的
            Method[] methods = c1.getMethods();
            //根据方法名获取该类的public方法
            Method getName = c1.getMethod("getName");
            //获取该类的所有方法,不包括父类(仅自定义)
            Method[] declaredMethods = c1.getDeclaredMethods();
            //根据方法名获取该类的方法
            Method getAge = c1.getDeclaredMethod("getAge");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

注:获取方法的方式与获取字段的方法一样,在这里我们需要注意的是重写的方法,一个类中存在俩个或多个方法名是一样的,因此在根据方法名获取方法时,提供第二个参数,为可变参数。参数类型为我们获取方法的参数类型的类,如果不写默认为无参方法。

④、获取类的构造器

public class TestDemo {
    public static void main(String[] args) {
        try {
            Class c1 = Class.forName("Student");
            //获取该类的所有构造器,包括父类
            Constructor[] constructors = c1.getConstructors();
            //根据构造器的参数类型来获取指定构造器,不写为无参构造器
            Constructor constructor = c1.getConstructor(String.class, Integer.class);
            //获取该类的所有构造器,不包括父类
            Constructor[] declaredConstructors = c1.getDeclaredConstructors();
            //根据构造器的参数类型来获取指定的自定义构造器,不写为无参构造器
            Constructor declaredConstructor = c1.getDeclaredConstructor();
            Constructor declaredConstructor1 = c1.getDeclaredConstructor(String.class, Integer.class);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

注:在我们获取类构造器和类方法时涉及到可变参数的知识,大家可以自行百度一下,或者查阅官方文档,也不难,就是在我们不确定参数有几个时,就可以写成可变参数,我们在使用时可以传多个参数。注意我们写的参数都为类对象!

我们获取到构造器第一想法应该是实例化对象。

⑤、类的实例化

public class TestDemo {
    public static void main(String[] args) {
        try {
            Class c1 = Class.forName("Student");
            //通过class类直接实例化,使用的是User类的无参构造器
            Student student = (Student) c1.newInstance();
            //获取构造器来进行实例化,这里获取有参构造器
            Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, Integer.class);
            //根据构造器进行实例化
            Student student1 = (Student) declaredConstructor.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

注:我们在使用类对象直接实例化时,一定要确保需实例化的类中存在无参构造器,否则会报错。默认获取的是Object类型,因此最后需要进行下类型转化。
测试:我们在User类中重写toString方法打印下获取的对象看一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GUvhgV9X-1669042421223)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1667315461519.png)]

我们获取到对象是不是该通过获取的对象调用方法,NO!我们通过反射来调用对象的方法。

⑥、方法的调用

测试:我们打印下该对象看一下方法执行了没有

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NkgkzwYM-1669042421224)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1667315793190.png)]

注:如果我们调用的方法为私有方法,虽然编译器通过,在运行时会报错的(java.lang.IllegalAccessException),这是因为java的安全检查。我们可以使用setAccessible(true)这个方法来跳过安全检查。

public class TestDemo {
    public static void main(String[] args) {
        try {
            Class c1 = Class.forName("Student");
            //通过class类直接实例化,使用的是User类的无参构造器
            Student student = (Student) c1.newInstance();
            //获取setName方法
            Method setName = c1.getMethod("setName", String.class);
            //跳过安全检查
            setName.setAccessible(true);
            setName.invoke(student,"xiaohu");
            System.out.println(student);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

我们在写程序时一般通过get/set方法来操作字段,下面我们同样也是通过反射来操作字段。

⑦、字段的操作

public class TestDemo {
    public static void main(String[] args) {
        try {
            Class c1 = Class.forName("Student");
            Student student= (Student) c1.newInstance();
            //获取name字段
            Field name = c1.getDeclaredField("name");
            //通过该字段的set方法来改变该字段的值,该字段有俩个参数
            //第一个为应该修改其字段的参数
            //第二个为被修改字段的新值
            name.set(student,"小胡");

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
}

测试:我们打印下该对象,看一下name字段改变没有。

这还不够,反射很强,我们说过反射的对象像一面镜子,我们能看到的东西都可以获取,我们下面来读取一下参数泛型,返回值泛型!

⑧、泛型的操作(Generic)

对于泛型我们应该不会陌生,java采用泛型擦除的机制来引入泛型。也就是说java的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换的麻烦。但是一旦编译完成,所有和泛型有关的数据全部擦除。
为了通过反射操作这些类型以迎合实际开发的需要,Java就新增了ParameterizedType, GenericArrayType,TypeVariable 和WildcardType几种类型来代表不能被归一到Class 类中的类型但是又和原始类型齐名的类型,这四种类型实现了Type接口。

类型 含义
ParameterizedType 参数化类型,带有类型参数的类型,即常说的泛型,如:List《T》
TypeVariable 类型变量,如参数化类型Map《E,Y》中的Y、K等类型变量,表示泛指任何类
GenericArrayType (泛型)数组类型,比如List《T》[],T[]这种。注意,这不是我们说的一般数组,而是表示一种【元素类型是参数化类型或者类型变量的】数组类型
WildcardType 代表通配符表达式,或泛型表达式,比如【?】【? super T】【? extends T】。虽然WildcardType是Type的一个子接口,但并不是Java类型中的一种

我们演示一下反射读取ParameterizedType类型。

public class TestDemo10 {
    public static void main(String[] args) {
        try {
            //先获取到该类
            Class c1 = Class.forName("test.TestDemo10");
            //获取到测试方法
            Method genericityTest = c1.getDeclaredMethod("GenericityTest", List.class, Student.class);
            //获取到类型参数数组,就是获取方法所有的参数类型
            Type[] genericParameterTypes = genericityTest.getGenericParameterTypes();
            for (Type genericParameterType : genericParameterTypes) {
                //输出一下类型参数
                System.out.println(genericParameterType);
                //我们在循环时判断该参数类型,若该参数属于参数化类型
                if (genericParameterType instanceof ParameterizedType) {
                    //若属于参数化类型,则获取类型对象的数组,表示此类型的实际类型参数
                    Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
                    for (Type actualTypeArgument : actualTypeArguments) {
                        //打印下实际类型参数
                        System.out.println(actualTypeArgument);
                    }
                }
            }
            
            //获取方法所有的参数类型
            Type[] genericParameterTypes1 = genericityTest.getGenericParameterTypes();
            //获取返回值的参数类型,返回值只有一个,所有不是数组
            Type genericReturnType = genericityTest.getGenericReturnType();


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
    //测试的方法 ,返回类型与参数都为泛型
    public static Map<String, Student> GenericityTest(List<Student> list, Student student) {
        return null;
    }
}

我们看着可能会很复杂,我们来分析一下。
首先,genericityTest这个为我们获取的方法,我们通过genericityTest来获取该方法的参数,注意看,这里返回的是Type类型,也就是所有类型的父接口,我们打印下看,就是返回的List与User,也就是他的俩个参数List,student。
接下来我们遍历下类型Type参数数组,我们现在需要的是读取参数化类型,那么我们对每一个Type参数进行判断,如果该Type参数属于ParameterizedType参数化类型,那么我们在获取到该泛型的实际类型参数,也就是List中的Student,注意,只有List《Student》才属于参数化类型,可以查看上面的表。
注:我们在上面演示的只是获取方法的参数,那么我们如何获取返回值的类型?下面第二个方法

//获取方法所有的参数类型
Type[] genericParameterTypes = genericityTest.getGenericParameterTypes();
//获取返回值的参数类型,返回值只有一个,所有不是数组
Type genericReturnType = genericityTest.getGenericReturnType();

  //获取方法所有的参数类型
Type[] genericParameterTypes = genericityTest.getGenericParameterTypes();
//获取返回值的参数类型,返回值只有一个,所有不是数组
Type genericReturnType = genericityTest.getGenericReturnType();

⑨、注解的操作

注解的操作相对就比较简单了,如果我们想读取类上、方法上或字段上的注解,我们仅需要获取到你需要读取的注解所修辞的类、方法或字段来获取就可以。

我们以获取方法上的注解来测试一下:
这里我们还是使用我们在文章首部创建的TestAnnotation注解,只能放在方法上,保留到运行时。

public class AnnotationTest {

public class TestDemo {
    public static void main(String[] args) {
        try {
            Class c1 = Class.forName("Student");
            //先获取方法
            Method getName = c1.getDeclaredMethod("getName");
            //根据我们的main方法获取getName方法上的注解
            MyAnnotation declaredAnnotation = getName.getDeclaredAnnotation(MyAnnotation.class);
            //获取到他的值
            String value = declaredAnnotation.value();
            System.out.println(value);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

注:如果我们需要获取类上的注解,只需要获取到类对象,然后.getDeclaredAnnotation()即可,其实不管是获取类上的注解还是字段上的注解都是一样的方法,关于有无Declared的方法,看到这里大家应该也有了解了。

ation = getName.getDeclaredAnnotation(MyAnnotation.class);
//获取到他的值
String value = declaredAnnotation.value();
System.out.println(value);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
注:如果我们需要获取类上的注解,只需要获取到类对象,然后.getDeclaredAnnotation()即可,其实不管是获取类上的注解还是字段上的注解都是一样的方法,关于有无Declared的方法,看到这里大家应该也有了解了。
如有侵权,请联系删除,谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

注解和反射 的相关文章

  • 在java中轮询Http服务器(重复发送http get请求)

    当对其进行 REST 调用时 我的 Web 服务器会发送一些信息 我想不断轮询该服务器 间隔5秒后重复发送HTTP GET请求 以检查返回的信息是否有任何变化 做到这一点最有效的方法是什么 您能提供一些代码示例吗 请注意 我只想开发客户端代
  • 按下按钮并在java中的新窗口中打开文件

    我创建了一个 JFrame 并放置了一个文本字段和按钮 在文本字段中我放置了从文本文件读取的名称 我知道我想单击按钮并打开一个已知窗口 我想在其中放置名称 其他信息来自同一个文件 这是我的代码 这是我的主框架 package Fronten
  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • 如何在由子控件组成的 SWT 复合材料上跟踪鼠标?

    我创建了自己的控件 我想跟踪鼠标并添加一个MouseTrackListener 很遗憾MouseEnter and MouseLeave当鼠标移动到我的合成部分 即标签和按钮 上时 也会生成事件 Mouse enter mouse ente
  • 有没有创建 Cron 表达式的 Java 代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个 Java 代码来根据用户输入创建一个 cron 表达式 用户输入是时间 频率和执行次数 只需从评论中添加 自己创建 即可
  • 垃圾收集器如何在幕后工作来收集死对象?

    我正在阅读有关垃圾收集的内容 众所周知 垃圾收集会收集死亡对象并回收内存 我的问题是 Collector 如何知道任何对象已死亡 它使用什么数据结构来跟踪活动对象 我正在研究这个问题 我发现GC实际上会跟踪活动对象 并标记它们 每个未标记的
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • java inputstream 打印控制台内容

    sock new Socket www google com 80 out new BufferedOutputStream sock getOutputStream in new BufferedInputStream sock getI
  • 断言 Kafka 发送有效

    我正在使用 Spring Boot 编写一个应用程序 因此要写信给 Kafka 我这样做 Autowired private KafkaTemplate
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • 如何将 HTML 链接放入电子邮件正文中?

    我有一个可以发送邮件的应用程序 用 Java 实现 我想在邮件中放置一个 HTML 链接 但该链接显示为普通字母 而不是 HTML 链接 我怎样才能将 HTML 链接放入字符串中 我需要特殊字符吗 太感谢了 Update 大家好你们好 感谢
  • 使用 Elastic Beanstalk 进行 Logback

    我在使用 Elastic Beanstalk 记录应用程序日志时遇到问题 我正在 AWS Elastic Beanstalk 上的 Tomcat 8 5 with Corretto 11 running on 64bit Amazon Li
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • Android S8+ 警告消息“不支持当前的显示尺寸设置,可能会出现意外行为”

    我在 Samsung S8 Android 7 中收到此警告消息 APP NAME 不支持当前的显示尺寸设置 可能会 行为出乎意料 它意味着什么以及如何删除它 谢谢 通过添加解决supports screens 机器人 xlargeScre
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack
  • MiniDFSCluster UnsatisfiedLinkError org.apache.hadoop.io.nativeio.NativeIO$Windows.access0

    做时 new MiniDFSCluster Builder config build 我得到这个异常 java lang UnsatisfiedLinkError org apache hadoop io nativeio NativeIO
  • Java 11 - 将 Spring @PostConstruct 替换为 afterPropertiesSet 或使用 initMethod

    我正在使用 spring 应用程序 有时会使用 PostConstruct用于代码和测试中的设置 看来注释将被排除在外Java 11 https www baeldung com spring postconstruct predestro

随机推荐

  • 随机森林和神经网络有什么区别?

    随机森林和神经网络这两种广泛使用的机器学习算法有什么区别呢 我们什么时候应该使用神经网络 什么时候又应该使用随机森林 随机森林与神经网络哪个更好 这是一个常见问题 答案其实也非常简单 视情况而定 调皮 一起来看看何时使用随机森林好以及何时使
  • Golang大坑之循环goroutine闭包调用

    前言 回顾整个2022 突然发现我一篇博客都没写 趁着还没2022还没过去 赶紧水一篇博客 分享一下我最近学习到的一些东西 这次的主题是 Golang大坑之循环goroutine闭包调用 大家就当小故事来看吧 小美又写了bug 仔细看 这个
  • jmeter-Java关于MD5加密方法 以及16位32位互转

    MD5即Message Digest Algorithm 5 信息 摘要算法5 用于确保信息传输完整一致 是计算机广泛使用的杂凑算法之一 又译摘要算法 哈希算法 主流编程语言普遍已有MD5实现 将数据 如汉字 运算为另一固定长度值 是杂凑算
  • GDB调试进程方法

    简单易懂的gdb调试进程方法 更新中 1 首先找出需要调试的进程PID 命令 ps ef grep 进程名 2 gdb attach PID 中断进程 并附着进程 接下来就可以调试了 3 设置断点 break 函数名 文件名 行号 比如 b
  • 基于元学习孪生网络的人脸识别算法(PC复现篇)

    一 说明 本文参考 Python元学习 通用人工智能的实现 第二章部分内容 修改代码使其在通用环境下跑通 本文为实际项目的前期学习汇报 后续项目也许会出现在博客或者我的b站账户上 物理系的计算机选手 原版完整代码 动手 元学习 使用 Pyt
  • python 水仙花数

    水仙花数 水仙花数是指 一个三位数各位数字的立方和等于该数本身 解析 使用多重循环来解 水仙花数的百位可能的数字为1 9 十位和个位可能的数字是0 9 用三重循环来遍历所有可能的数字组合 for bai in range 1 10 for
  • 电赛备战心酸历程!!!

    辛辛苦苦备战电赛两个月 然后电赛延期了
  • 时间序列-预测(Forcasting):时间序列预测算法总结

    一 背景介绍 绝大部分行业场景 尤其是互联网 量化行业 每天都会产生大量的数据 金融领域股票价格随时间的走势 电商行业每日的销售额 旅游行业随着节假日周期变化的机票酒店价格等 我们称这种不同时间收到的 描述一个或多种特征随着时间发生变化的数
  • 主题:java并发编程-Executor框架

    http www iteye com topic 366591
  • 【Opencv读取中文路径图像】

    Opencv读取中文路径图像 if img0 None uipath unicode path utf8 img data np fromfile path np uint8 img0 cv2 imdecode img data 1
  • Python~OS模块--将文件保存到指定路径

    需求 写爬虫时 想将爬取下来的文件保存到指定的路径 环境 Python3 7 注意 windows下 用于区分系统路径 在python里面是转义符 os listdir 返回指定目录下的所有目录和文件名 os mkdir 创建指定路径下目录
  • 一维条码解码

    一维条码是一种能用于信息编码和信息自动识别的标准符号 是由一组宽度不同的黑白符号按一定规则交替排列编码组成的图形符号可用于表示一定的信息 它是对物品进行代号标识需要依赖数据库或通讯网络才能发挥最大的作用 常见的码制 条码符号类型 有EAN
  • Nacos踩坑记录之The IPv4 address(“nacos.xxxx.local“) is incorrect

    版本 spring cloud alibaba 2021 1 项目构建工具 gradle nacos server 2 0 3 1 问题 昨天早上上班来了之后 运营的同事着急的过来说生产环境登不上了 我赶紧打开日志看了之后 就发现了这样的报
  • C语言期末大作业-运动会管理系统 包含源码和设计文档

    C语言 运动会管理系统 源码和3000多字的设计文档非常详细 代码注释非常详细 部分功能测试截图如下 下载链接在文末 点我下载资源 https download csdn net download weixin 43474701 60281
  • 多线程练习-基于 AtomicInteger 实现多线程自增同一个变量

    Atomic原子类有很多的类型 由于有原子性 所以实例化的变量在多线程中不会有线程安全问题 感兴趣的可以搜索 题目 基于 AtomicInteger 实现多线程自增同一个变量 代码及其注释 基于 AtomicInteger 实现多线程自增同
  • 蓝桥杯C++算法训练-拿金币(动态规划)

    问题描述 有一个N x N的方格 每一个格子都有一些金币 只要站在格子里就能拿到里面的金币 你站在最左上角的格子里 每次可以从一个格子走到它右边或下边的格子里 请问如何走才能拿到最多的金币 输入格式 第一行输入一个正整数n 以下n行描述该方
  • FPGA基本算术运算

    FPGA基本算术运算 FPGA基本算术运算 1 有符号数与无符号数 2 浮点数及定点数 I 定点数的加减法 II 定点数的乘除法 3 仿真验证 i 加减法验证 ii 乘除法验证 FPGA基本算术运算 FPGA相对于MCU有并行计算 算法效率
  • 生成对抗网络(GAN) 手写数字图像生成

    生成式对抗网络 GAN 简介 生成式对抗网络的框架主要有两个模型 一个是生成模型 Generator 记为为 G 是用来生成数据 通过大量的样本学习 生成一些能够以假乱真的数据样本 第二个是辨别模型 Discriminator 记为D 主要
  • CCF 2014年9月第一题--相邻数对(java)

    package com hsx ccf import java util Scanner public class Ccf20140901 public static void main String args SuppressWarnin
  • 注解和反射

    一 注解 1 什么是注解 注解说白了就是对程序做出解释 与我们在方法 类上的注释没有区别 但是注解可以被其他程序所读取 进行信息处理 否则与注释没有太大的区别 2 内置注解 内置注解就是我们的jdk所带的一些注解 常用的三个注解 Overr