java注解与反射的基本使用(这一篇就够了!)

2023-10-29

一、注解(Annotation)

1.什么是注解?
相信大家对注解应该并不陌生,在现在信息飞速发展的年代,各种优秀的框架或许都离不开注解的使用,像我们在实现接口一个方法时,也会有@Override注解。注解说白了就是对程序做出解释,与我们在方法、类上的注释没有区别,但是注解可以被其他程序所读取,进行信息处理,否则与注释没有太大的区别。
2.内置注解
内置注解就是我们的jdk所带的一些注解。常用的三个注解:

  • @Override
    这个应该都不陌生,修辞方法,表示打算重写超类中的方法声明。
  • @Deprecated
    这个注解我们应该也不会陌生,我们可能看不到这个注解,但是我们肯定在使用一些方法时会出现横线。表示废弃,这个注释可以修辞方法,属性,类,表示不鼓励程序员使用这样的元素,通常是因为他很危险或有更好的选择。
    在这里插入图片描述
  • @SuperWarnings
    这个注解主要是用来抑制警告信息的,我们在写程序时,可能会报很多黄线的警告,但是不影响运行,我们就可以用这个注解来抑制隐藏它。与前俩个注解不同的是我们必须给注解参数才能正确使用他。
参数 说明
deprecation 使用了过时的类或方法的警告
unchecked 执行了未检查的转换时的警告 如:使用集合时未指定泛型
fallthrough 当在switch语句使用时发生case穿透
path 在类路径、源文件路径中有不存在路径的警告
serial 当在序列化的类上缺少serialVersionUID定义时的警告
finally 任何finally子句不能完成时的警告
all 关于以上所有的警告

上表中就是@SuperWarnings注解的一些参数,按需使用即可。
@SuperWarnings(“finally”)
@SuperWarnings(value={“unchecked”,“path”})
在这里插入图片描述在这里插入图片描述
3.自定义注解

格式:public @interface 注解名 { 定义体 }

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

    //参数默认为空
    String value() default "";
    
}

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

  • @Target
    这个注解的作用主要是用来描述注解的使用范围,说白了就是我们自己定义的注解可以使用在哪个地方。
所修饰范围 取值ElementType
package 包 PACKAGE
类、接口、枚举、Annotation类型 TYPE
类型成员(方法,构造方法,成员变量,枚举值) CONSTRUCTOR:用于描述构造器。FIELD:用于描述域。METHOD:用于描述方法
方法参数和本地变量 LOCAL_VARIABLE:用于描述局部变量。PARAMETER:用于描述参数

在这里插入图片描述
我们自定义一个注解,在声明元注解时可以看到提供我们的所有常量。我们以ElementType.METHOD为例。

@Target(ElementType.METHOD)
public @interface TestAnnotation {

	//参数默认为空
    String value() default "";
    
}

我们在来测试一下这个注解
在这里插入图片描述
结果显而易见,当我们将注解放在我们的变量时,编译器给我们报了一个错,翻译过来的意思就是这个注解不被允许放在这里。而放在方法上就可以安静的放在那里。

  • @Retention
    这个注解的作用就是我们需要告诉编译器我们需要在什么级别保存该注释信息,用于描述注解的生命周期。
取值RetentionPolicy 作用
SOURCE 在源文件中有效(即源文件保留)
CLASS 在class文件中有效(即class保留)
RUNTIME 在运行时有效(即运行时保留)注:为RUNTIME时可以被反射机制所读取
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {

	//参数默认为空
    String value() default "";
    
}

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

  • @Document
  • @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类的对象?
我们先创建一个普通的实体类。

package sml.reflect;

public class User {

    //这里name用的是私有类型
    private String name;
    //这里age用的是公有类型
    public int age;

	//无参构造器
    public User(){}
    
    //有参构造器
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    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;
    }
}
  1. 通过Class.forName()获取(最常用
public class TestReflect {
    public static void main(String[] args) {
        try {
            //获取User的Class对象,参数为需要获取类对象的全类名
           Class aClass = Class.forName("sml.reflect.User");
        //因为是动态编译,所有我们需要抛出类未找到的异常   
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
  1. 通过getClass()获取
public class TestReflect {
    public static void main(String[] args) {
        //new一个user对象
        User user = new User();
        //通过user对象来获取User类对象
        Class aClass = user.getClass();
    }
}
  1. 通过.class获取
public class TestReflect {
    public static void main(String[] args) {
        //通过导包获取类名点class来获取类对象
        Class aClass = User.class;
    }
}

3.反射的基本操作
我们获取到Class对象后,可以获取该类的某些信息。在这里我们来看一些常用的。
1)获取类名

Class aClass = Class.forName("sml.reflect.User");
 //获取全类名
String name = aClass.getName();
 //获取简单的类名
String simpleName = aClass.getSimpleName();

结果:
在这里插入图片描述
2)获取类的字段、某些变量

Class aClass = Class.forName("sml.reflect.User");

//获取该类的所有public字段,包括父类的
Field[] fields = aClass.getFields();
//根据字段名获取该类的public字段
Field field = aClass.getField("age");

//获取该类的所有字段,不包括父类(仅自定义)
Field[] fields1 = aClass.getDeclaredFields();
//根据字段名获取该类的字段
Field field1 = aClass.getDeclaredField("name");

注意:我们仔细看注释,不带Declared的方法职能获取到public字段,且包括父类的,带Declared的方法可以获取到所有的自定义的字段!
测试一下:
在这里插入图片描述
在这里插入图片描述
3)获取类的方法

Class aClass = Class.forName("sml.reflect.User");

//获取该类的所有public方法,包括父类的
Method[] methods = aClass.getMethods();
//根据方法名获取该类的public方法
Method method = aClass.getMethod("getName");
//如果该类为重写方法,可以在第二个参数加上重写方法的参数类型,不写为无参数的方法
Method paramMethod = aClass.getMethod("getName",String.class)

//获取该类的所有方法,不包括父类(仅自定义)
Method[] declaredMethods = aClass.getDeclaredMethods();
//根据方法名获取该类的方法
Method declaredMethod = aClass.getDeclaredMethod("getName");

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

4)获取类的构造器

 Class aClass = Class.forName("sml.reflect.User");

//获取该类的所有构造器,包括父类
Constructor[] constructors = aClass.getConstructors();
//根据构造器的参数类型来获取指定构造器,不写为无参构造器
Constructor constructor = aClass.getConstructor();
Constructor constructor1 = aClass.getConstructor(String.class,int.class);

//获取该类的所有构造器,不包括父类
Constructor[] declaredConstructors = aClass.getDeclaredConstructors();
//根据构造器的参数类型来获取指定的自定义构造器,不写为无参构造器
Constructor declaredConstructor = aClass.getDeclaredConstructor();
Constructor declaredConstructor1 = aClass.getDeclaredConstructor(String.class, int.class);

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

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

5)类的实例化

Class aClass = Class.forName("sml.reflect.User");

//通过class类直接实例化,使用的是User类的无参构造器
User user = (User) aClass.newInstance();
            
//获取构造器来进行实例化,这里获取有参构造器
Constructor declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class);
//根据构造器进行实例化
User user1 = (User) declaredConstructor.newInstance("sml",18);

注:我们在使用类对象直接实例化时,一定要确保需实例化的类中存在无参构造器,否则会报错。默认获取的是Object类型,因此最后需要进行下类型转化。
测试:我们在User类中重写toString方法打印下获取的对象看一下
在这里插入图片描述
我们获取到对象是不是该通过获取的对象调用方法,NO!我们通过反射来调用对象的方法。
6)方法的调用

Class aClass = Class.forName("sml.reflect.User");

User user = (User) aClass.newInstance();
//获取setName方法
Method setName = aClass.getDeclaredMethod("setName", String.class);
//通过获取的方法来调用(invoke),invoke方法有俩个参数
//第一个是调用底层方法的对象,也就是通过哪个对象来调用方法
//第二个为可变参数,是用于方法调用的参数
setName.invoke(user,"sml");

测试:我们打印下该对象看一下方法执行了没有
在这里插入图片描述
注:如果我们调用的方法为私有方法,虽然编译器通过,在运行时会报错的(java.lang.IllegalAccessException),这是因为java的安全检查。我们可以使用setAccessible(true)这个方法来跳过安全检查。

Class aClass = Class.forName("sml.reflect.User");

User user = (User) aClass.newInstance();
Method setName = aClass.getDeclaredMethod("setName", String.class);
//若setName为私有方法,跳过安全检查
setName.setAccessible(true);
setName.invoke(user,"sml");

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

Class aClass = Class.forName("sml.reflect.User");

User user = (User) aClass.newInstance();
//获取name字段
Field name = aClass.getDeclaredField("name");
//通过该字段的set方法来改变该字段的值,该字段有俩个参数
//第一个为应该修改其字段的参数
//第二个为被修改字段的新值
name.set(user,"sml");

测试:我们打印下该对象,看一下name字段改变没有
在这里插入图片描述
呀,报错了。看这个错眼熟不,我们在上面说过,这是因为我们的name字段为私有,我们不能直接去操作该字段,需要跳过安全检查,我们加上name.setAccessible(true);再来运行一下。
在这里插入图片描述

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

对于泛型我们应该不会陌生,java采用泛型擦除的机制来引入泛型。也就是说java的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换的麻烦。但是一旦编译完成,所有和泛型有关的数据全部擦除。
为了通过反射操作这些类型以迎合实际开发的需要,Java就新增了ParameterizedTypeGenericArrayTypeTypeVariableWildcardType几种类型来代表不能被归一到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 TestReflect {

    //测试方法,返回类型与参数都为泛型
    public static Map<String,User> GenericityTest(List<User> list,User user){
        return null;
    }

    public static void main(String[] args) {
        try {
            //先获取到该类
            Class aClass = Class.forName("sml.reflect.TestReflect");
            //获取到测试方法
            Method genericityTest = aClass.getDeclaredMethod("GenericityTest", List.class,User.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);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

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

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

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

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

public class AnnotationTest {

    @TestAnnotation("sml")
    public static void main(String[] args) {

        try {
            Class aClass = Class.forName("sml.annotation.AnnotationTest");
            Method main = aClass.getDeclaredMethod("main",String[].class);
            //根据我们的main方法获取main方法上的注解
            TestAnnotation declaredAnnotation = main.getDeclaredAnnotation(TestAnnotation.class);
            //获取到他的值
            String value = declaredAnnotation.value();
            System.out.println(value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

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

最后说一下,到这里我们可能没有体会到注解的太大作用,在后面的文章我会写一篇手写SpringMVC框架的博客,当然只是简单到不能简单的版本。如果将这篇文章看会,在自己写一下,关于注解与反射我相信大家应该都会的差不多了。

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

java注解与反射的基本使用(这一篇就够了!) 的相关文章

  • 上传进度条 Java Servlet?

    我想使用 servlet 显示上传进度条 我尝试过Ajax iFrame 技术 页面没有重新加载 文件也被上传 但是 进度条没有出现 有没有可用于 javaservlts 的 jQuery 进度插件 Thanks 我强烈推荐jQuery 上
  • 枚举的子类化

    有没有一种简单的方法来子类化Javaenum 我问这个问题是因为我有大约 10 个实现相同接口的对象 但它们对某些方法也有相同的实现 因此我想通过将所有相同的实现放置在扩展的中间对象中来重用代码Enum它也是我需要的所有其他类的超类 或许事
  • Jackson JSON + Java 泛型

    我正在尝试将以下 JSON 反序列化 映射到List
  • Android:如何暂停和恢复可运行线程?

    我正在使用 postDelayed 可运行线程 当我按下按钮时 我需要暂停并恢复该线程 请任何人帮助我 这是我的主题 protected void animation music6 music4 postDelayed new Runnab
  • 同一服务器上的许多应用程序具有相同的 JMX Mbean 类

    我有超过 5 个 Spring Web 应用程序 它们都在使用另一个通用库 这个公共库有它自己的 MBean 由于强制的唯一 objectName 约束 我的应用程序无法部署在同一服务器上 我使用 MBean 的方式是这样的 Managed
  • 使用 proguard 混淆文件名

    我正在使用 proguard 和 Android Studio 混淆我的 apk 当我反编译我的apk时 我可以看到很多文件 例如aaa java aab java ETC 但我项目中的所有文件都有原始名称 有没有办法混淆我的项目的文件名
  • 为什么在 10 个 Java 线程中递增一个数字不会得到 10 的值?

    我不明白 a 的值为0 为什么 a 不是10 那段代码的运行过程是怎样的 是否需要从Java内存模型来分析 这是我的测试代码 package com study concurrent demo import lombok extern sl
  • 以相反的顺序打印任何集合中的项目?

    我在 使用 Java 进行数据结构和问题解决 一书中遇到以下问题 编写一个例程 使用 Collections API 以相反的顺序打印任何 Collection 中的项目 不要使用 ListIterator 我不会把它放在这里 因为我想让有
  • 使用 Exec Maven 插件分叉 Java,而不使用“exec”目标

    来自文档 https www mojohaus org exec maven plugin exec exec在单独的进程中执行程序和Java程序 exec java在同一虚拟机中执行 Java 程序 我想 fork 一个 java 程序
  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • JAXB - 忽略元素

    有什么方法可以忽略 Jaxb 解析中的元素吗 我有一个很大的 XML 文件 如果我可以忽略其中一个大而复杂的元素 那么它的解析速度可能会快很多 如果它根本无法验证元素内容并解析文档的其余部分 即使该元素不正确 那就更好了 例如 这应该只生成
  • ThreeTen 向后移植与 JSR-310 的比较

    由于某些原因 我们现在无法使用 java 8 我们仍然停留在 java 7 上 不过 我想使用新的JSR 310 date time APIs现在 使用官方向后移植 ThreeTen http www threeten org threet
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样

随机推荐

  • 【LeetCode第2场双周赛】

    第 2 场双周赛 A 模拟 class Solution public int sumOfDigits vector
  • 【LeetCode刷题】303 区域和检索 -数组不可变 java

    题目 给定一个整数数组 nums 处理以下类型的多个查询 计算索引 left 和 right 包含 left 和 right 之间的 nums 元素的 和 其中 left lt right 实现 NumArray 类 NumArray in
  • python3 [爬虫入门实战] 查看网站有多少个网页(站点)

    前提 进行爬虫的时候需要进行站点的爬取 再选用合适的爬虫框架 所以这里不得不需要知道一下一个网站到底有多少个网页组成 一个域名网站中到底有多少个站点 查看的方法很简单 直接百度就可以了 例如需要知道豆丁网的站点有多少个 直接在百度中输入 s
  • C# 关闭进程

    using System Diagnostics string fileName example txt Process processes Process GetProcessesByName processName foreach Pr
  • (Qt)day4

    widget h ifndef WIDGET H define WIDGET H include
  • ElasticSearch简介

    文章目录 ElasticSearch简介 正向索引和倒排索引 正向索引 倒排索引 ElasticSearch和MySQL的区别 ElasticSearch简介 什么是ElasticSearch ElasticSearch 是一款非常强大的开
  • stlink仿真器报错及处理过程记录

    项目使用stlink连接stm32f101系列的芯片 因为没有仔细阅读相关资料 出一些莫名的错 搞了大半天 前言 使用正版的stlink系列仿真器 身在山寨之国 貌似不用盗版不太合适 这里的盗版指的是别人生产来卖钱的 自己根据电路图做的不算
  • 知识的融入-增强深度学习的学习 Shades of Knowledge- Infused Learning for Enhancing Deep Learning

    知识的融入 增强深度学习的学习 摘要 SHALLOW INFUSION OF KNOWLEDGE 知识的浅层注入 Word embeddings Enriched word embeddings Deep neural language m
  • ctfshow 菜狗杯wp

    果然菜狗杯是教育我们是菜狗的 我是从第二天开始做的 这里只做了一个上午 因为下午网没了 做不了 做出来的有点少 社工也做出来挺多但是感觉社工的wp感觉就没有啥必要写了 目录 misc 签到题 损坏的压缩包 web web签到 web2 c0
  • CUDA入门笔记(三)GPU编程基础——一个典型GPU程序

    参考 优达学城 https classroom udacity com courses cs344 lessons 55120467 concepts 670611900923 一 典型GPU程序构成 一个典型GPU程序有如下几个部分 CP
  • MAC如何将[搜狗输入法]设置为默认输入法

    问题描述 即使我们下载了搜狗输入法 且在mac的 系统偏好设置 里面设置了搜狗输入法 但是当我们切屏幕的时候总是一会 简体拼音 一会 搜狗输入法 解决方式 方式1 只保留搜狗一个输入法 推荐 温馨提示 现在很多第三方输入法都已经具备中英文快
  • ResNet 论文精读 & 残差块的恒等映射 & 网络结构的解析

    论文重要知识 恒等映射 两种残差块 维度匹配和残差学习 层响应标准差 Deep Residual Learning for Image Recognition 用于图像识别的深度残差学习 目录 一 摘要 二 Introduction 介绍R
  • 深入学习java源码之Math.scalb()与 Math.powerOfTwoF()

    深入学习java源码之Math scalb 与 Math powerOfTwoF final关键字 final在Java中是一个保留的关键字 可以声明成员变量 方法 类以及本地变量 一旦你将引用声明作final 你将不能改变这个引用了 编译
  • 百度面试题——天平称重问题

    问题描述 用天平 只能比较 不能称重 从一堆小球中找出其中唯一一个较轻的 使用x 次天平 最多可以从y 个小球中找出较轻的那个 求y 与x 的关系式 解题思想 该题主要考查逻辑思维能力 我在首次遇见该题时 首先想到的对半拆分 找出其中较轻的
  • CUDA矩阵乘法及优化【参加CUDA线上训练营】

    目录 矩阵乘法 CPU方式 GPU方式 GPU中矩阵相乘步骤 GPU矩阵乘法代码示例 利用shared memory优化矩阵乘法 Share Memory矩阵乘法代码示例 矩阵乘法 CPU方式 利用三个for循环进行矩阵乘法 GPU方式 G
  • 网盘系统

    作者主页 编程千纸鹤 作者简介 Java 前端 Pythone开发多年 做过高程 项目经理 架构师 主要内容 Java项目开发 毕业设计开发 面试技术整理 最新技术分享 收藏点赞不迷路 关注作者有好处 文末获得源码 项目编号 BS XX 1
  • CTFhub_SSRF靶场教程

    CTFhub SSRF 题目 1 Bypass 1 1 URL Bypass 请求的URL中必须包含http notfound ctfhub com 来尝试利用URL的一些特殊地方绕过这个限制吧 1 利用 绕过限制url https www
  • http post 方法传递参数的2种方式

    try HttpPost httpPost new HttpPost url StringEntity stringEntity new StringEntity param param参数 可以为 key1 value1 key2 val
  • 什么是人力资源360度评估法?

    1 360度评估法的定义 360度评估法 360 Feedback 又称 360度考核法 或 全方位考核法 属于人力资源中绩效考核方法之一 是指由员工自己 上司 直接部属 同仁同事甚至顾客或家人等从全方位 各个角度来评估人员的方法 而且 为
  • java注解与反射的基本使用(这一篇就够了!)

    一 注解 Annotation 1 什么是注解 相信大家对注解应该并不陌生 在现在信息飞速发展的年代 各种优秀的框架或许都离不开注解的使用 像我们在实现接口一个方法时 也会有 Override注解 注解说白了就是对程序做出解释 与我们在方法