类加载器和反射

Transformers在自动驾驶领域的应用(High-level like in scene) Transformers uses global attention mechanism to capture long-range interaction information. Two core modules in Transformers are Self-Attention and Cross-Attention, which defined asAttn(Q,K,V)=softmax(QK⊤dk)VSelfAttn(X)=Attn(WQX,WKX,WVX)CrossAttn(X,Y)=Attn 阅读详情

1.什么是类加载器

1.概念:类加载器是用来加载类的工具(从硬盘加载到JVM内存)

2.类加载的时机有哪些?
    一句话总结:类在使用时才被加载,不使用不加载。想想类什么时候被使用到呢?
    1)创建类的对象时
    2)通过类名调用静态方法时
    3)通过反射加载类
    
3.类加载器的分类(了解)
    启动类加载器:Bootstrap ClassLoaders,负责加载JAVA_HOME\lib目录下的jar和class文件
    平台类加载器:Platform ClassLoader
    应用程序类加载:System ClassLoader

2.类加载器应用

使用类加载器加载src目录下的配置文件s

Properties pro=new Properties();

//使用类加载器获取src目录下文件的输入流
InputStream in = ClassLoader.getssSystemClassLoader().getResourceAsStream("a.properties");
//把配置文件中的键和值,加载到Properties集合
pro.load(in);

System.out.prisntln(pro);

反射

反射可以在程序运行时,动态的获取每一个类的各个组成部分(成员变量Filed、成员方法Method、构造方法Constructor), 并使用。

 

1.获取clazz

//1. Class.forName("类的全路径名");
Class clazz1=Class.forName("com.ithiema.Student");

//2. 类名.class
Class clazz2=Student.class;

//3. 对象名.getClass()
Student stu=new Student();
Class clazz3=stu.getClass();

2.反射获取构造方法

public Constructor[] getConstructors()  
    获取构造方法的数组(public修饰的)
public Constructor getConstructor(Class<?>... parameterTypes)  
    获取一个构造方法(public修饰的)

public Constructor[] getDeclaredConstructors()  
    获取所有的构造方法(包括私有的)
public Constructor getDeclaredConstructor()
    获取一个构造方法(可以获取私有)

获取构造方法

//1.获取字节码
Class clazz = Class.forName("com.itheima.Student");

//2.获取多个构造方法
Constructor[] cons = clazz.getConstructors();
for (Constructor con : cons) {
    System.out.println(con);
}

System.out.println("---------------");
//3.获取空参数的构造方法
Constructor con = clazz.getConstructor();
System.out.println(con);

//4.获取有两个参数构造方法(私有的)
Constructor con2 = clazz.getDeclaredConstructor(String.class, int.class);
System.out.println(con2);

使用构造方法

//1.获取字节码
Class clazz = Class.forName("com.itheima.Student");

//2.获取空参数的构造方法
Constructor con = clazz.getConstructor();
//3.通过空参数构造方法创建对象
//等价于 Student stu1=new Student();
Student stu1 = (Student) con.newInstance();
System.out.println(stu1);


//4.获取有两个参数构造方法(私有的)
Constructor con2 = clazz.getDeclaredConstructor(String.class, int.class);
//通过有参数构造方法创建对象
//等价于 Student stu2=new Student("张三",20);
//如果构造方法是私有的,需要调用方法取消权限检查(暴力反射)
con2.setAccessible(true);
Student stu2  = (Student) con2.newInstance("张三", 20);
System.out.println(stu2);

//直接使用字节码创建对象(默认是按照空参数构造方法创建的对象)
Object o = clazz.newInstance();
System.out.println(o);

3.反射获取成员变量

public Field[] getFields()  
    获取多个成员变量(public修饰的)
public Field getField(String name)  
    获取某一个成员变量(public修饰的)
    
public Field[] getDeclaredFields() 
    获取所有的成员变量(包括私有的)
public Field getDeclaredField(String name)  
    获取一个成员变量(可以获取私有的)

获取成员变量

//1.获取字节码对象
Class clazz = Class.forName("com.itheima02.Student");

//2.获取所有公有成员变量
Field[] fields = clazz.getFields();
for (Field field : fields) {
    System.out.println(field);
}

//3.获取所有的成员变量(所有的都要)
Field[] fields1 = clazz.getDeclaredFields();
for (Field field : fields1) {
    System.out.println(field);
}

使用成员变量

//1.获取字节码对象
Class clazz = Class.forName("com.itheima02.Student");

//2.创建Student对象,反射创建对象
Student obj = (Student) clazz.newInstance();

//3.获取一个成员变量age
Field ageFiled = clazz.getField("age");
//set:给属性设置值
ageFiled.set(obj,18); //等价于 obj.setAge(18)
//get: 获取属性值
Integer ageValue = (Integer) ageFiled.get(obj); //等价于 int age= obj.getAge();
System.out.println(ageValue);

3.反射获取成员方法

public Method[] getMethods()  
    获取多个成员方法(public修饰的)
public Method getMethod(String name,Class ... parmars)  
    获取某一个成员方法(public修饰的)
    
public Method[] getDeclaredtMethods() 
    获取所有的成员方法(包括私有的)
public Method getDeclaredMethod(String name,Class ... parmars)  
    获取一个成员方法(可以获取私有的)

获取成员方法

//1.获取类的字节码
Class clazz = Class.forName("com.itheima04.Student");

//2.获取公有成员方法,父类方法也能获取到
Method[] ms = clazz.getMethods();
for (Method m : ms) {
    System.out.println(m);
}

//3.获取包括私有的成员方法,不包括父类的方法
Method[] ms1 = clazz.getDeclaredMethods();
for (Method method : ms1) {
    System.out.println(method);
}

//获取show()方法
Method m1 = clazz.getDeclaredMethod("show");
System.out.println(m1);

//获取show(String n)方法
Method m2 = clazz.getMethod("show", String.class);
System.out.println(m2);

//获取show(String n,int y)方法
Method m3 = clazz.getMethod("show", String.class, int.class);
System.out.println(m3);

//获取fun()方法
Method m4 = clazz.getMethod("fun");
System.out.println(m4);

 

反射+配置文件

  • 先写几个类

    public class Student {
        private String name;
        private int age;
    
        public void study(){
            System.out.println("学生在学习");
        }
    }
    
    public class Teacher {
        private String name;
        private int age;
    
        public void teach(){
            System.out.println("老师在讲课");
        }
    }

     写一个配置文件在src目录下

    classname=com.itheima05.Teacher
    methodname=teach

    写测试类

    //需求:通过配置文件+反射,在不改变源代码的情况下,可以执行任意一个类的任意方法。
    public class Demo5 {
        public static void main(String[] args) throws Exception {
            //读取配置文件
            Properties pro=new Properties();
            //使用类加载器读取src目录下文件
            InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream("config.properties");
            pro.load(in);
    
            //获取键对应的值
            //获取类名
            String classname = pro.getProperty("classname");
            //获取方法名
            String methodname = pro.getProperty("methodname");
    
            //通过反射获取classname对应的字节码
            Class<?> clazz = Class.forName(classname);
            //创建类的对象
            Object obj = clazz.getConstructor().newInstance();
    
            //通过反射获取methodname对应的方法
            Method method = clazz.getMethod(methodname);
            //执行方法
            method.invoke(obj);
        }
    }

通过薄膜太阳能电池中的热激电流量化陷阱状态 发光(led)和光伏(PV)器件的性能取决于光活性半导体材料的质量。由于材料杂质或在制造过程中在半导体材料中无意地引入缺陷,导致偏离最佳性能。这些缺陷被称为阱态,或简称“阱”,它是半导体带隙内的高能态。一般来说,陷阱的发生可能是由于材料杂质(在散装)或在不同材料层之间的界面。在有机半导体中,由于天然物质的无序性,阱态经常出现。在无机和杂化半导体(例如:杂化钙钛矿、硅……)中,晶界的存在是圈闭态的已知来源。由于陷阱产生的原因多种多样,它们对装置的影响也是多种多样的。由于载流子的多次捕获和释放事件,特别是浅阱的 阅读详情

相关推荐

从病毒分析到安全研究:手把手教你用OD破解加壳程序的反调试机制

本文深入探讨了如何识别并绕过加壳程序的反调试机制,特别是针对使用IsDebuggerPresent等API检测的防护手段。通过实战案例和工具链配置,详细介绍了逆向工程中的关键技巧,包括内存补丁、硬件断点定位OEP等,帮助安全研究人员有效突破软件保护技术。

tgb345678的博客 823

Java核心技术梳理-类加载机制与反射

一、引言 反射机制是一个非常好用的机制,C#和Java中都有反射,反射机制简单来说就是在程序运行状态时,对于任意一个类,能够知道这个类的所有属性和方法,对于任意一个对象,能够调用它的任意属性和方法,其实初听就知道反射是一个比较暴力的机制,它可能会破坏封装性。 通过反射的定义我们可以想到反射的好处:可以灵活的编写代码,代码可以在运行时装配,降低代码的耦合度,动态代理的实现也离不开反射。 为了更...

weixin_30826095的博客 156

Device Mapper 代码分析

Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备。DM以块设备的形式注册到Linux内核中,凡是挂载(或者说“映射”)于DM结构下的块设备,不管他们是如何组织,如何通讯,在Linux看来都是一个完整的DM块设备。因此DM让不同组织形式的块设备或者块设备集群在Linux内核面前有一个完整统一的DM表示。一、DM

SonicLing的专栏 1万+

反射机制和类加载机制

1.反射的定义 3.反射相关的类 4.Class类代表类的实体,在运行的java应用程序中表示类和接口。java文件被编译后生成.class文件,JVM此时就要去解读.class文件。java.class文件也会被JVM解析为一个对象,这个对象就是java.lang.class。这样当程序在运行时,每个java文件就最终变成了Class类对象的实例。我们通过java的反射机制应用到这个实例,就可以去获取、添加、改变这个类的属性和方法。使得这个类成为一个动态的类。Class对象是反射的基础,一个类对应一

yahid的博客 1057

深入解析雪球网股票行情数据爬取:基于WebSocket与API的实时数据获取技术实践

本文详细介绍了如何使用Python爬虫技术获取雪球网的股票行情数据,涵盖了WebSocket实时数据连接和RESTful API接口调用两种主要技术方案。完整的WebSocket客户端,支持实时行情订阅和数据处理功能丰富的API客户端,支持多种数据类型的获取数据存储和管理系统,使用SQLite进行数据持久化实时监控和预警系统,支持自定义预警规则技术指标计算,提供基本的数据分析功能。

2201_76125261的博客 1255

12、每日卫星任务规划问题的不同公式

本文探讨了卫星任务规划问题的多种数学公式表示方法,包括传统的整数线性规划(ILP)模型、改进的基于路径的公式、基于集合覆盖的公式以及动态规划公式。通过案例研究比较了不同公式的求解效率和适用场景,并提供了使用Python进行实际求解的操作步骤。最后讨论了进一步优化策略及未来研究方向,旨在为解决卫星任务规划问题提供全面的理论支持和实践指导。

assembly8low的博客 203

类加载与反射

类加载 当程序使用某个类时,如果该类没有被装载进内存,则系统会通过加载、连接、初始化三个步骤来对类进行初始化。类加载就是类加载器将.class文件加载进JVM虚拟机中,并在虚拟机内存中产生一个Class对象。使用任何一个类虚拟机都会创建一个java.lang.Class类对象。 类加载使用的类加载器是JVM提供,采用双亲委派机制。 类加载器分为四种 启动类加载起 BootStrapClassLoader 用来加载核心类库 扩展类加载器 extensionsClassLoader 用来加载JRE的扩展

弈秋之鹤的博客 371

2022年全国职业院校技能大赛高职组大数据技术与应用赛项赛卷⑩—解析答案

工业互联网是工业全要素、全产业链、全价值链的全面连接,是人、机、物、工厂互联互通的新型工业生产制造服务体系,是互联网从消费领域向生产领域、从虚拟经济向实体经济拓展的核心载体,是建设现代化经济体系、实现高质量发展和塑造全球产业竞争力的关键支撑。加快发展工业互联网产业,不仅是各国顺应产业发展大势,抢占产业未来制高点的战略选择,也是我国推动制造业质量变革、效率变革和动力变革,实现高质量发展的客观要求。 为完成工业大数据分析工作,你所在的小组将应用大数据技术,以Scala作为整个项目的基础开发语言,基于大数据平台综

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 581

Java学习笔记(十三)

Java学习笔记(十三) Junit单元测试 测试分类 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值 白盒测试:需要写代码的,关注程序具体的执行流程 Junit使用(白盒测试) 使用步骤 定义一个测试类 定义测试方法:可以独立运行 给方法加@Test注解 导入junit依赖 结果 红色:失败 绿色:成功 一般我们会使用断言操作处理结果 Assert.assertEquals(期望的结果,实际的结果); @Test public void testAdd(){ //创

qq_45184360的博客 259

【CUDA Runtime】第一个“Hello World“程序

CUDA(Compute Unified Device Architecture)是 NVIDIA 提供的一个并行计算平台和编程模型,旨在通过利用 GPU 的强大计算能力来加速计算密集型应用。对于许多开发者而言,开始学习 CUDA 编程的第一步通常是编写一个简单的“Hello World”程序。尽管 CUDA 的实际应用远远超出一个简单的例子,但这个初步的示例能帮助开发者快速入门,理解基本的 CUDA 编程流程。

m0_62599305的博客 1504

【深度学习新浪潮】算力行业的核心技术有哪些?

算力行业核心技术是芯片+互联+存储+调度+能效+软件的全栈协同:芯片提供算力、互联打通集群、存储保障数据、调度提升效率、能效支撑规模、软件释放算力。当前AI大模型推动算力从“单机”走向“万卡级超节点集群”,技术竞争从单一芯片升级为系统级、全栈化的综合能力。

专注:太空算力、AI infra、异构调度、大模型成本工程 338

反射与类加载器

反射: 所谓的反射就是指,在java程序运行时,获得某些对象的实际结构与类型的过程。 创建对象的方式: 用new调用构造方法创建对象 用newInstance()按照类型创建对象 用Class.formName()根据类名创建对象(类型必须在jar包中,不然创建不了) 类加载器: ClassLoader:在JVM启动的过程中,把类模板加载到内存中的工具。就是将一个存在与系统文件中的.class文件,加载到当前JVM的内存中,变成java能识别的Class类型。 启动项加载器:由C语言完成的,当JV

qq_43234235的博客 485

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

反射和类加载器

转载请注明:http://blog.youkuaiyun.com/hel_wor/article/details/50375054 当初看了几本书后因为觉得反射,多态,动态链接有共同的地方,所以对底层有了好奇。终于能动手写这篇博客了,前前后后的逻辑感觉能走通了。 反射和类加载器的关系,即是我们在反射调用某个类时,这个类会被类加载器加载一次,第一个问题,如何去加载这个类,第二个问题,谁来加载这个类。加载的这个类

HEL_WOR的博客 1392

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java类加载器和反射

文章目录一、类加载器1.类的加载2.类初始化时机(何时加载到内存中)3.类加载器的组成二、反射1.反射原理步骤2.获取一个类的class文件对象的三种方式3.获取class文件中的成员(1)使用反射获取无参的构造方法并运行(2)使用反射获取有参的构造方法并运行(3)反射获取构造方法并运行的快捷方式(4)反射获取私有构造方法并运行(暴力反射)(5)反射获得成员变量并修改(6) 反射获得成员方法并运行...

weixin_38356640的博客 467

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

类加载器和反射的基础了解

在java的世界里,一切皆对象。其实从某种意义上说,在java中有两种对象:实例对象和Class对象。实例对象就是我们平常定义的一个类的实例 而Class对象是没办法用new关键字得到的,因为它是jvm生成用来保存对应类的信息的,换句话说,当我们定义好一个类文件并编译成.class字节码后,编译器同时为我们创建了一个Class对象并将它保存.class文件中。我不知道这样描述是否妥当,因为我也见过某些书上直接把.class文件称之为Class对象。同时在jvm内部有一个类加载机制,即在需要的时候(懒加载)将

qq_45511733的博客 266

day14-类加载器和反射机制

我们在idea中 通过ctrl+p 可以查看一个方法对应的形参 那这个功能是如何实现的?其实就是通过反射来完成的。反射就是从类里面拿东西。那现在有一个问题 为什么不用io流来读取呢?答:io流是从上下文往下 依次读取 当我们读取到 构造方法和成员方法的时候 并不好区分;并且 成员变量和局部变量也不好区分;如下图 我们利用反射 可以获取到类中的每一个信息。是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意属性和方法;

qq_74289024的博客 1130

Java——类加载器和反射

Java反射机制和类加载器的讲述,代码演示

程序员阿龙的博客 529

Java类加载器和反射技术

Java 反射机制是Java语言一个很重要的特性,它使得Java具有了“动 态性”。在Java程序运行时,对于任意的一个类,我们能不能知道这 个类有哪些属性和方法呢?对于任意的一个对象,我们又能不能调 用它任意的方法?答案是肯定的!这种动态获取类的信息以及动态 调用对象方法的功能就来自于Java 语言的反射(Reflection)机 制。

qq_69331283的博客 821

Java系列之:类加载器和反射

一、类加载器 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。不出意外情况,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者类初始化。 类的加载: 就是指将class文件读入内存,并为之创建一个java.lang.Class对象 任何类被使用时,系统都会为之建立一个java.lang.Class对象 类的连接: 验证阶段:用于检验被加载的类是否有正确的内部结构,并和其他类协调一致 准备阶段:负责为类的类变量分配

zhengzaifeidelushang的博客 441

【Java后端】类加载器和反射思想

类加载器 作用: 负责将.class文件加载到内存中,并为之生成对应的 java.lang.Class 对象。 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出现意外情况,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者类初始化 JVM的类加载机制: 全盘负责:当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载...

akisi的博客 325

Java类加载器和反射机制

1.类加载器 1.1类加载【理解】 类加载的描述 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出现意外情况,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者类初始化 类的加载 就是指将class文件读入内存,并为之创建一个 java.lang.Class 对象 任何类被使用时,系统都会为之建立一个 java.lang.Class 对象 类的连接 验证阶段:用于检验被加载的类是否有正确的内部结

子非余 143
上一篇: 网络编程
下一篇: XML、Schema约束、枚举以及注解
Figure_TheKeyboard
博客等级 码龄5年 6粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值