首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Java入门提高篇】Day13 Java中的反射机制

最近看到各种知识付费的推出,感觉是好事,也是坏事,好事是对知识沉淀的认可与推动,坏事是感觉很多人忙于把自己的知识变现,相对的在沉淀上做的实际还不够,我对此暂时还没有什么想法,总觉得,慢慢来,会更快一点,...当然,反射的功能不仅仅是获取类的信息,还可以在运行时动态创建对象,回想一下,我们正常的对象使用,都是需要在代码中先声明,然后才能使用它,但是使用反射后,就能在运行期间动态创建对象并调用其中的方法,甚至还能直接查看类的私有成员变量...,还能获取类的注解信息,在泛型中类型判断时也经常会用到。...Class有很多方法来获取更多关于类的信息,这里使用getDeclaredField方法来获取指定字段信息,返回的是Field类型对象,这个对象里存储着关于字段的一些信息,如字段名称,字段类型,字段修饰符.../** * 复制一个类对象属性到另一个类对象中 * @param objA 需要复制的对象 * @param objB 复制到的目标对象类型 * @return

74090
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JVM 的类初始化机制

    包括但不限于以下事项: bytecode 的完整性(integrity) 检查final类没有被继承,final方法没有被覆盖 确保没有不兼容的方法签名 Preparation 在一个类已经被load并且通过...在这个阶段,JVM 会为类的成员变量分配内存空间并且赋予默认初始值,需要注意的是这个阶段不会执行任何代码,而只是根据变量类型决定初始值。...如果不进行默认初始化,分配的空间的值是随机的,有点类型c语言中的野指针问题。...Initialization 经过了上面的load、link后,第一次 主动调用某类的最后一步是Initialization,这个过程会去按照代码书写顺序进行初始化,这个阶段会去真正执行代码,注意包括:...Preparation阶段会根据类型赋予默认值,在Initialization阶段会根据显示赋值的表达式再次进行赋值(按顺序自上而下执行)。

    42520

    JVM 的类初始化机制

    当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制...包括但不限于以下事项: bytecode 的完整性(integrity) 检查final类没有被继承,final方法没有被覆盖 确保没有不兼容的方法签名 Preparation 在一个类已经被load并且通过...在这个阶段,JVM 会为类的成员变量分配内存空间并且赋予默认初始值,需要注意的是这个阶段不会执行任何代码,而只是根据变量类型决定初始值。...如果不进行默认初始化,分配的空间的值是随机的,有点类型c语言中的野指针问题。...Preparation阶段会根据类型赋予默认值,在Initialization阶段会根据显示赋值的表达式再次进行赋值(按顺序自上而下执行)。

    33230

    Java方法签名

    ,与方法的返回值一点关系都没有,这是判断重载重要依据,所以,以下的代码是不允许的 public long aaaa(){ } public int aaaa(){ } 方法签名的格式...: JVM为我们提供的方法签名实际上是由方法名(上文的例子为了简单没有写出全类名)、形参列表、返回值三部分构成的,基本形式就是: 全类名.方法名(形参数据类型列表)返回值数据类型 Java方法签名中特殊字符...D double [ 数组 以[开头,配合其他的特殊字符,表示对应数据类型的数组,几个[表示几维数组 L 全类名 引用类型 以 L 开头 ; 结尾,中间是引用类型的全类名 一定要注意的是方法重载时...,方法返回值没有什么意义,是由方法名和参数列表决定的 利用javap生成方法签名 $ javap -s java.lang.String Compiled from "String.java"...,java.lang.CharSequence{ public static final java.util.Comparator CASE_INSENSITIVE_ORDER; Signature

    4.4K30

    学了那么久的 Java基础,该试着进阶了【测试,反射,注解】

    白盒测试则相反,没有像黑盒测试一样对代码进行隐藏,测试人员会利用程序内部的逻辑结构及有关信息,通过在不同点检查程序状态,检验程序中的每条通路是否都能按预定要求进行正确工作。 2....JUnit 简介 在我们写代码的时候,经常会需要测试代码的内部逻辑,这时我们可以使用 JUnit 来进行白盒测试。 JUnit 是一个 Java 编程语言的单元测试框架。...多数Java的开发环境都已经集成了JUnit作为单元测试的工具。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。 2....在方法名中加 Declared 的是返回所有的方法或变量,不加 Declared 的只返回 public 访问权限的方法或变量 有参数的获取方法都是在方法名中没有在结尾处加s的,返回的是指定参数类型的方法和变量...注解的作用 注解一般有以下三种作用: ① 编写文档:通过代码里标识的注解生成文档【生成文档doc文档】 ② 代码分析:通过代码里标识的注解对代码进行分析【使用反射】 ③ 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查

    27720

    前端入门25-福音 TypeScript声明正文-TypeScript

    ,比如函数期待接收数组类型的参数,但调用时却传入了字符串类型,此时 js 引擎并不会报错,对于它来说,这是合理的行为,但从程序、从功能角度来看,也许就不会按照预期的执行,所以通常需要在函数内部进行一些额外处理...Java 的变量分:类变量和实例变量,属于类的变量如果是公开权限,那么所有地方都允许访问,属于实例的变量,分成员变量和局部变量,成员变量在实例内部所有地方都可以访问,在实例外部如果是公开权限,可通过对象来访问...,与 Java 的写法有如下区别: 类的属性只能在构造函数内声明和初始化,无法像 Java 一样在构造函数外面先声明成员变量的存在; 无法定义静态变量或静态方法,即没有 static 语法; 权限控制...接口 鸭式辩型其实严格点来讲就是对具有结构的值进行类型检查,而具有结构的值也就是对象了,所以对对象的类型检查,其实也就是在对对象进行类别划分。...当对象或函数作为函数参数时,通过接口来定义这些参数的类型,就特别有用,这样可以控制函数调用时传入了预期类型的数据,如果类型不一致时,编译阶段就会报错。

    3.2K21

    阿里开源新一代单元测试 Mock 工具!

    TestableMock是基于源码和字节码增强的Java单元测试辅助工具,包含以下功能: 访问被测类私有成员:使单元测试能直接调用和访问被测类的私有成员,解决私有成员初始化和私有方法测试的问题 快速Mock...任意调用:使被测类的任意方法调用快速替换为Mock方法,实现"指哪换哪",解决传统Mock工具使用繁琐的问题 辅助测试void方法:利用Mock校验器对方法的内部逻辑进行检查,解决无返回值方法难以实施单元测试的问题...此外,在单元测试中时常会需要对被测对象进行特定的成员字段初始化,但有时由于被测类的构造方法限制,使得无法便捷的对这些字段进行赋值。...覆写被测类自身的成员方法 有时候,在对某些方法进行测试时,希望将被测类自身的另外一些成员方法Mock掉。...测试无返回值的方法 如何对void类型的方法进行测试一直是许多单元测试框架在悄悄回避的话题,由于以往的单元测试手段主要是对被测单元的返回结果进行校验,当遇到方法没有返回值时就会变得无从下手。

    1.1K20

    阿里开源新一代单元测试 Mock 工具!

    TestableMock是基于源码和字节码增强的Java单元测试辅助工具,包含以下功能: 访问被测类私有成员:使单元测试能直接调用和访问被测类的私有成员,解决私有成员初始化和私有方法测试的问题 快速Mock...任意调用:使被测类的任意方法调用快速替换为Mock方法,实现"指哪换哪",解决传统Mock工具使用繁琐的问题 辅助测试void方法:利用Mock校验器对方法的内部逻辑进行检查,解决无返回值方法难以实施单元测试的问题...此外,在单元测试中时常会需要对被测对象进行特定的成员字段初始化,但有时由于被测类的构造方法限制,使得无法便捷的对这些字段进行赋值。...覆写被测类自身的成员方法 有时候,在对某些方法进行测试时,希望将被测类自身的另外一些成员方法Mock掉。...测试无返回值的方法 如何对void类型的方法进行测试一直是许多单元测试框架在悄悄回避的话题,由于以往的单元测试手段主要是对被测单元的返回结果进行校验,当遇到方法没有返回值时就会变得无从下手。

    95620

    cas与自旋锁(轻量级锁就是自旋锁吗)

    而java.util.concurrent中的大多数类的实现都直接或间接的使用了这些原子类。 Unsafe类使Java拥有了类似C语言指针操作内存空间的能力,同时也带来了指针的安全问题。...//创建Unsafe类的实例 private static final Unsafe unsafe = Unsafe.getUnsafe(); //成员变量value是在内存地址中距离当前对象首地址的偏移量...obj, long offset, int delta) { int v; do { //通过对象和偏移量获取变量值作为期望值,在修改该内存偏移位置的值时与原始进行比较...CAS的缺点 (1)ABA问题 如果一个线程t1正修改共享变量的值A,但还没修改,此时另一个线程t2获取到CPU时间片,将共享变量的值A修改为B,然后又修改为A,此时线程t1检查发现共享变量的值没有发生变化...AtomicStampedReference类的compareAndSet方法作用是首先检查当前引用是否等于预期引用,并且当前版本号是否等于预期版本号,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值

    1.3K10

    Java一分钟之-继承:复用与扩展类的特性

    子类自动获得父类的所有非私有成员(包括字段和方法),并能添加或覆盖父类的方法以实现特定功能的增强。...解决方案:使用@Override注解明确表示当前方法意在覆盖父类方法,有助于编译器检查正确性。 2.3 访问权限 易错点:子类尝试访问父类的私有成员。...解决方案:遵循封装原则,只通过公共或受保护的接口操作父类成员。 2.4 类型转换 易错点:盲目进行向上转型或向下转型,导致ClassCastException。...解决方案:在向下转型前,使用instanceof检查对象类型。 3. 如何避免问题 深入理解继承机制:明确继承的目的在于复用和扩展,而非仅仅为了代码重用。...接口隔离原则:通过接口而不是具体类进行功能扩展,保持设计的灵活性和低耦合。 结语 继承是Java中实现代码复用和扩展的强大工具,但同时也要求开发者对其规则有深刻的理解和恰当的应用。

    23810

    JAVA安全编码标准学习分享

    1、只有受信子类能对具有不变性的类和方法进行扩展 2、声明数据成员为私有并提供可访问的封装器方法 3、当改变基类时,保存子类之间的依赖,不能破坏子类所依赖的程序不可变性。...当一个参数化的数个类型要访问一个对象,而这个对象又不是参数化数据类型时,会产生堆污染,未经检查的警告在错误时排查较困难 5、不可变类为可变实例(成员)提供复制功能,避免传递给非受信代码时修改原来的实例,...9、在异常条件时,保证释放已经持有的锁 10、不要执行那些持有锁时会阻塞的操作 11、不要使用不正确形式的双重检查惯用法,需要保证延迟初始化必须在多线程中是同步的 12、当类方法和类成员使用不同的内置锁时...,比如从doPrivileged()代码块中返回指向敏感资源的引用 2、不要在特权代码块中使用没有验证或者非受信的变量 3、不要基于非受信源进行安全检查,任何非受信对象或者参数必须在检查之前做防御性深度复制...4、使用安全管理器检查来操作敏感操作 5、不要使用反射来增加类、方法、字段的可访问性 6、不要依赖于默认的URLClassLoader和java.util.jar提供的自动化签名检查 7、当编写一个自定义的类装载器时

    4.7K10

    C++继承、虚函数、RTTI、友元类、异常处理

    ,可以看到,如果使用普通变量定义来初始化子类对象,子类的对象可以作为父类对象使用,这时候因为会调用拷贝构造函数,最终变为一个新的父类对象,所以没有意义。...纯虚函数 在java中我们有接口的定义,接口定义的方法必须是抽象方法,要求子类必须实现,纯在抽象方法的类不能实例化。...,可以直接将类作为友元,如 class B; class A{ void show(B b){} } class B{ friend class A; } RTTI cpp中为了对强制转换进行更高一级的优雅限制...并且如果向下转型是错误的,也不会报错,static_cast与强制转化类似,将当前引用/指向的内存空间作为转化后的类型来用,这会导致一些不可知的错误,如读取从成员变量所对应的空间是别的用途或者未初始化的...关键字抛出一个任意对象,程序会将其作为一个异常对象处理,处理步骤 1.查找被包围的匹配类型的catch块,有就跳到catch块代码 2.没有找到匹配的catch块,则调用terminate函数,一般编译器处理是调用

    80510

    java的注解

    注解的分类 Java注解可以根据它们的使用范围、生命周期和成员属性等特性进行分类。 按照使用范围分类: 类注解:用于修饰类、接口和枚举。 方法注解:用于修饰方法。 字段注解:用于修饰字段。...按照成员属性分类: 标记注解(Marker Annotation):没有成员属性的注解,例如@Override。...语法和使用 定义注解 Java注解使用关键字“@interface”进行定义,它定义的注解会自动继承java.lang.annotation.Annotation接口,因此注解可以作为类、方法、字段等的修饰符使用...例如,可以使用Java注解来约束变量的类型、方法的参数和返回值、方法的访问权限等,从而提高代码质量和可维护性。 3....@Override @Override注解用于表示该方法是父类或接口中的方法的重写,可以帮助编译器检查是否正确地重写了父类或接口中的方法。 2.

    44720

    Java开发编程规范: 4.OOP 规约

    一个是字母的 O,一个是数字的 0,加@Override 可以准确判断是否覆盖成功。另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。...【强制】相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object。 说明:可变参数必须放置在参数列表的最后。...接口提供方既然明确是过时接口, 那么有义务同时提供新的接口;作为调用方来说,有义务去考证过时方法的新实现是什么。...说明:POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何 NPE 问题,或者入库检查,都由使用者来保证。...反例:POJO 类的 gmtCreate 默认值为 new Date(),但是这个属性在数据提取时并没有置入具体值,在更新其它字段时又附带更新了此字段,导致创建时间被修改成当前时间。

    97541

    java编程思想第八章多态

    8.1再论向上转型:   对象既可以作为本身的类型使用,也可以作为基类的类型使用。这种做法成为向上转型。   其代码表现就是:父类引用指向子类。   ...多态允许在参数的地方使用,即参数处声明基类,用于接受基类或导出类实现。 8.2转机(主要是介绍如何实现多态)   为了解决多态问题,在java中提供了后期绑定的方法,即在运行时根据对象的类型进行绑定。...2)调用基类构造器。     3)按照声明的顺序调用成员的初始化方法。     4)调用导出类的构造器主体。   ...导出类的被覆盖的方法可以返回基类方法的返回类型的某种导出类型。 8.5用继承进行设计:   实际上是表明了在继承用于设计的时候,一定要慎重,:   继承要求在编译时就要知道确切的类型。   ...实际上在java中每一次转型都会的得到检查,称之为“运行时类型识别”(RTTI)。

    37530

    Java 中文官方教程 2022 版(四)

    注解可以使用的位置 注解可以应用于声明:类、字段、方法和其他程序元素的声明。当用于声明时,每个注解通常按照惯例出现在自己的一行上。 从 Java SE 8 发布开始,注解也可以应用于类型的使用。...类型注解是为了支持改进 Java 程序的分析方式以确保更强的类型检查而创建的。...Java SE 8 发布没有提供类型检查框架,但允许您编写(或下载)一个作为一个或多个可插拔模块实现的类型检查框架,这些模块与 Java 编译器一起使用。...您可以使用多个类型检查模块,每个模块检查不同类型的错误。通过这种方式,您可以在需要时在 Java 类型系统的基础上构建,添加特定的检查。...假设您的开发人员想要创建一个Comparator实例,使他们能够以相反的顺序对对象集合进行排序。例如,如何按照牌面从大到小的顺序对扑克牌进行排序,从 A 到 2(而不是从 2 到 A)?

    18900

    Proguard 常用规则

    检查 Proguard结果 为了避免引入 bug 我们有必要对 结果进行检查。...、方法、类成员等的对照表 seeds.txt 列出没有被混淆的类和成员 usage.txt 列出被移除的代码 我们可以根据 seeds.txt 文件检查未被混淆的类和成员中是否已包含所有期望保留的...readResolve(); } Note: 注意字段类型带上包名; String 类型为 java.lang.String;另外,如果只保留了类成员没有保留类跟没有保留一样 还是拿上面那个例子,...它可能仍会删除,优化或混淆其他班级成员。 如果指定了一个方法,则ProGuard仅将该方法作为入口点进行保存。其代码可能仍会进行优化和调整。 类规范 类规范是类和类成员(字段和方法)的模板。...也可以使用短类名(无包)或使用完整的类名来指定构造函数。和Java语言一样,构造函数规范有一个参数列表,但没有返回类型。 类访问修饰符和类成员访问修饰符通常用于限制通配类和类成员。

    1.8K20
    领券