Day 241 注解与反射(4)

2023-11-23 22:18
文章标签 注解 反射 day 241

本文主要是介绍Day 241 注解与反射(4),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注解与反射(4)

反射

什么时候会发生类初始化

类的主动引用(一定会发生类的初始化)

  • 当虚拟机启动,先初始化main方法所在的类
  • new一个类的对象
  • 调用类的静态成员(除了final常量)和静态方法
  • 使用java.lang.reflect包的方法对类进行反射调用
  • 当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类

类的被动引用(不会发生类的初始化)

  • 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化
  • 通过数组定义类引用,不会触发此类的初始化
  • 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)

具体的

package com.yangxu.Annotation.reflection;//什么时候发生类的初始化
public class Load {static {System.out.println("main方法的初始化");}public static void main(String[] args) throws ClassNotFoundException {//主动引用------------------------------------------------//1. new对象一定发生初始化,且如果父类未初始化会先初始化父类//Son son = new Son();//2. 反射也会主动引用初始化//Class.forName("com.yangxu.Annotation.reflection.Son");//被动引用------------------------------------------------//1. 子类引用父类的静态变量//System.out.println(Son.a);//2. 数组时//Son[] array = new Son[5];//3. 常量时,因为常量在连接时就已经完成了赋值,初始化不管它的事!//System.out.println(Son.M);}
}class Father{static int a = 1;static {System.out.println("父类的初始化");}
}class Son extends Father{static final int M = 100;static {System.out.println("子类的初始化");}
}

类加载器的作用

类加载的作用:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。

类缓存∶标准的JavaSE类加载器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间。不过JVM垃圾回收机制可以回收这些Class对象

image-20220317203932825

类加载器作用是用来把类(class)装载进内存的。JVM规范定义了如下类型的类的加载器。

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

具体的

package com.yangxu.Annotation.reflection;public class Loader {public static void main(String[] args) throws ClassNotFoundException {ClassLoader loader = ClassLoader.getSystemClassLoader();System.out.println(loader);ClassLoader parent = loader.getParent();System.out.println(parent);ClassLoader parent1 = parent.getParent();System.out.println(parent1);ClassLoader loader1 = Class.forName("com.yangxu.Annotation.reflection.Test01").getClassLoader();System.out.println(loader1);//JDK的包里面的类都是用根加载器ClassLoader loader2 = Class.forName("java.lang.Object").getClassLoader();System.out.println(loader2);//如何获得系统类加载器的加载路径System.out.println(System.getProperty("java.class.path"));/*C:\Program Files\Java\jdk1.8.0_291\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\rt.jar;C:\Users\Lenovo\Desktop\课程学习\Java学习\out\production\Java学习;D:\IJ\IntelliJ IDEA 2021.1.3\lib\idea_rt.jar由下往上查找加载器,双亲委派机制:如果有与JDK类重名的自定义类则不执行自定义类,执行JDK的*/}
}

创建运行时类的对象

通过反射获取运行时类的完整结构

Field、Method、Constructor、Superclass、Interface、Annotation

package com.yangxu.Annotation.reflection;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class Test08 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {Class c1 = Class.forName("com.yangxu.Annotation.reflection.User");//获得类的名字System.out.println(c1.getName());//获得包名+类名System.out.println(c1.getSimpleName());//获得类名System.out.println("=====================================");//获得类的属性Field[] fields = c1.getFields();for (Field field : fields) {System.out.println("public"+field);}fields = c1.getDeclaredFields();for (Field field : fields) {System.out.println("私有的:"+field);}System.out.println("=====================================");//获得指定属性的值
//        Field name = c1.getField("name");
//        System.out.println(name);Field name = c1.getDeclaredField("name");System.out.println(name);System.out.println("=====================================");//获得类的方法Method[] methods = c1.getMethods();for (Method method : methods) {System.out.println("public:"+method);}methods = c1.getDeclaredMethods();for (Method method : methods) {System.out.println("私有的:"+method);}System.out.println("=====================================");//获得类的指定方法//指定文件类型是因为方法重载Method name1 = c1.getMethod("getName");System.out.println(name1);Method name2 = c1.getDeclaredMethod("setName", String.class);System.out.println(name2);System.out.println("=====================================");//获得类的构造器Constructor[] constructors = c1.getConstructors();for (Constructor constructor : constructors) {System.out.println("public:"+constructor);}constructors = c1.getDeclaredConstructors();for (Constructor constructor : constructors) {System.out.println("私有的:"+constructor);}System.out.println("=====================================");//获得指定的构造器Constructor constructor = c1.getConstructor(String.class, int.class, int.class);System.out.println(constructor);Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class, int.class);System.out.println(declaredConstructor);}
}

这篇关于Day 241 注解与反射(4)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/420768

相关文章

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

Java常用注解扩展对比举例详解

《Java常用注解扩展对比举例详解》:本文主要介绍Java常用注解扩展对比的相关资料,提供了丰富的代码示例,并总结了最佳实践建议,帮助开发者更好地理解和应用这些注解,需要的朋友可以参考下... 目录一、@Controller 与 @RestController 对比二、使用 @Data 与 不使用 @Dat

基于@RequestParam注解之Spring MVC参数绑定的利器

《基于@RequestParam注解之SpringMVC参数绑定的利器》:本文主要介绍基于@RequestParam注解之SpringMVC参数绑定的利器,具有很好的参考价值,希望对大家有所帮助... 目录@RequestParam注解:Spring MVC参数绑定的利器什么是@RequestParam?@

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Java中使用注解校验手机号格式的详细指南

《Java中使用注解校验手机号格式的详细指南》在现代的Web应用开发中,数据校验是一个非常重要的环节,本文将详细介绍如何在Java中使用注解对手机号格式进行校验,感兴趣的小伙伴可以了解下... 目录1. 引言2. 数据校验的重要性3. Java中的数据校验框架4. 使用注解校验手机号格式4.1 @NotBl

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解