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

相关文章

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

使用@Slf4j注解,log.info()无法使用问题

《使用@Slf4j注解,log.info()无法使用问题》在使用Lombok的@Slf4j注解打印日志时遇到问题,通过降低Lombok版本(从1.18.x降至1.16.10)解决了问题... 目录@Slf4androidj注解,log.info()无法使用问题最后解决总结@Slf4j注解,log.info(

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

Linux基础入门 --9 DAY

文本处理工具之神vim         vi和vim简介 一、vi编辑器 vi是Unix及类Unix系统(如Linux)下最基本的文本编辑器,全称为“visual interface”,即视觉界面。尽管其名称中包含“visual”,但vi编辑器实际上工作在字符模式下,并不提供图形界面。vi编辑器以其强大的功能和灵活性著称,是Linux系统中不可或缺的工具之一。 vi编辑器具有三种主要的工作模

【反射知识点详解】

Java中的反射(Reflection)是一个非常强大的机制,它允许程序在运行时检查或修改类的行为。这种能力主要通过java.lang.reflect包中的类和接口来实现。 通过反射,Java程序可以动态地创建对象、调用方法、访问字段,以及获取类的各种信息(如构造器、方法、字段等)。 反射的用途 反射主要用于以下几种情况: 动态创建对象:通过类的Class对象动态地创建其实例。访问类的字段

day-50 求出最长好子序列 I

思路 二维dp,dp[i][h]表示nums[i] 结尾,且有不超过 h 个下标满足条件的最长好子序列的长度(0<=h<=k),二维数组dp初始值全为1 解题过程 状态转换方程: 1.nums[i]==nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h]+1) 2.nums[i]!=nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h-1

Go 在orm中使用反射

作为静态语言,golang 稍显笨拙,还好 go 的标准包reflect(反射)包弥补了这点不足,它提供了一系列强大的 API,能够根据执行过程中对象的类型来改变程序控制流。本文将通过设计并实现一个简易的 mysql orm 来学习它,要求读者了解mysql基本知识,并且跟我一样至少已经接触 golang 两到三个月。 orm 这个概念相信同学们都非常熟悉,尤其是写过rails的同学,对acti

[Day 73] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

AI在健康管理中的應用實例 1. 引言 隨著健康管理需求的提升,人工智能(AI)在該領域的應用越來越普遍。AI可以幫助醫療機構提升效率、精準診斷疾病、個性化治療方案,以及進行健康數據分析,從而改善病患的健康狀況。這篇文章將探討AI如何應用於健康管理,並通過具體代碼示例說明其技術實現。 2. AI在健康管理中的主要應用場景 個性化健康建議:通過分析用戶的健康數據,如飲食、運動、睡眠等,AI可

类型信息:反射-Class

在说反射前提一个概念:RTTI(在运行时,识别一个对象的类型) public class Shapes {public static void main(String[] args) {List<Shape> shapes = Arrays.asList(new Circle(), new Square(), new Triangle());for (Shape shape : shapes