关于类的加载机制和反射机制只看这一篇就够了,分析的非常详细(代码片段)

author author     2022-12-10     617

关键词:

类加载机制的原理

1.启动JVM
2.将需要运行的class文件加载到虚拟机内存中
3.找到主类,开始执行主函数

加载步骤:

1.先委托父类加载类,如果父类已经加载,就不需要再次加载,如果父类没有加载,再由本加载器加载
2.解析类路径,将类路径转换成文件路径
3.通过文件输入流来读取class文件,得到字节数组
4.将字节数组转换成类对象,对象的类型是Class类型

有哪些类加载器

类加载器:ClassLoader
AppClassLoader: 应用类加载器,负责加载核心类,加载自己写的类
ExtClassLoader: 扩展类加载器,负责加载扩展类库
bootstrap: JVM内置的加载器
Bootstrap类加载器是JVM的一部分,是由C++编写的,随着启动虚拟机就会创建一个bootstrap类加载器对象

获得Class对象的几种方式

1.通过类名.class

Class c1 = Student.class;

2.通过对象的getClass()方法

Class c2 = stu.getClass();

3.通过类加载器获得class对象

ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class c3 = classLoader.loadClass("com.newer.test.Student");

4.通过 Class.forName()获得Class对象;

Class c4 =  Class.forName("com.newer.test.Student");

总代码:
先创建学生类

package com.newer.test;

public class Student 
    private int num;
    private String name;
    private int age;
    public Student()
    
    private Student(int num)
        this.num = num;
    
    public Student(int num,String name,int age)
        this.num = num;
        this.name = name;
        this.age = age;
    
    public int getNum() 
        return num;
    
    public void setNum(int num) 
        this.num = num;
    
    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;
    
    @Override
    public String toString() 
        return "Student" +
                "num=" + num +
                ", name=‘" + name + ‘‘‘ +
                ", age=" + age +
                ‘‘;
    
package com.newer.test;

public class MainClass 
    public static void main(String[] args) throws  Exception

        Student stu = new Student();

        //获得Student的Class对象

        //1.通过类名.class
        Class c1 = Student.class;

        //2.通过对象的getClass()方法
        Class c2 = stu.getClass();

        //3.通过类加载器获得class对象
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        Class c3 = classLoader.loadClass("com.newer.test.Student");

        //4.通过 Class.forName()获得Class对象;
        Class c4 = Class.forName("com.newer.test.Student");

如何通过Class对象获得构造方法对象

类的所有的信息都在Class对象中
Class类是反射机制中的核心类

Class c = Class.forName(包名.类名);

//加载类,获得类的Class对象
Class c = Class.forName("com.newer.test.Student");

1.获得所有可见的构造方法

//1.获得所有可见的构造方法
Constructor[] cons= c.getConstructors();

2.获得所有已经声明的构造方法

//2.获得所有已经声明的构造方法
Constructor[] cons2= c.getDeclaredConstructors();

3.获得指定的可见的某一个构造方法

//3.获得指定的可见的某一个构造方法
Constructor cc = c.getConstructor(int.class,String.class,int.class);

4.从声明的方法中获得指定的构造方法

//4.从声明的方法中获得指定的构造方法
Constructor cc2 = c.getDeclaredConstructor(int.class);

总代码:
学生类

package com.newer.test;

public class Student 
    private int num;
    private String name;
    private int age;
    public Student()
    
    private Student(int num)
        this.num = num;
    
    public Student(int num,String name,int age)
        this.num = num;
        this.name = name;
        this.age = age;
    
    public int getNum() 
        return num;
    
    public void setNum(int num) 
        this.num = num;
    
    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;
    
    @Override
    public String toString() 
        return "Student" +
                "num=" + num +
                ", name=‘" + name + ‘‘‘ +
                ", age=" + age +
                ‘‘;
    

package com.newer.test;

import java.lang.reflect.Constructor;
/**
 * 反射机制动态获得类的信息
 */
public class FanShe 
    public static void main(String[] args) throws Exception
        //加载类,获得类的Class对象
        Class c = Class.forName("com.newer.test.Student");
        //通过Class对象获得类的信息
        //1.获得所有可见的构造方法
        Constructor[] cons= c.getConstructors();
        for (Constructor con:cons)
            System.out.println(con);
        
        System.out.println("------------------------");
        //2.获得所有已经声明的构造方法
        Constructor[] cons2= c.getDeclaredConstructors();
        for (Constructor con:cons2)
            System.out.println(con);
        
        System.out.println("------------------------");
        //3.获得指定的可见的某一个构造方法
        Constructor cc = c.getConstructor(int.class,String.class,int.class);
        System.out.println(cc);
        System.out.println("------------------------");
        //4.从声明的方法中获得指定的构造方法
        Constructor cc2 = c.getDeclaredConstructor(int.class);
        System.out.println(cc2);
        System.out.println("------------------------");
      

如何通过构造方法对象实例化

//通过构造方法对象得到类的实例对象
Object obj = cc.newInstance(123,"zhangsan",20);

访问私有构造方法:
cc2.setAccessible(true);

//通过私有构造方法实例化对象
//设置允许访问私有构造方法
cc2.setAccessible(true);
Object obj2 =  cc2.newInstance(22);

最后

感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

java数组,看这一篇就够了

...前,只有数组可以用来存储指定类型的对象;在自动装箱机制出现之前,只有数组可以用来存储基本数据类型;也就是说,在泛型和自动装箱机制出现之前,数组在Java当中的分量举足轻重。况且数组还是一种效率最高的存储和... 查看详情

java千问25:关于java类的构造方法,看这一篇就够了!

​Java语言中,类的构造方法是一种很特殊的方法。关于构造方法要记忆和理解的知识点其实挺多的,下面我们就来详细的讲讲构造方法,相信看过这篇文章之后,你会对构造方法有一个比较深刻的认识和理解。(预警:此文较长... 查看详情

关于bytehouse你想知道的一切,看这一篇就够了

ByteHouse的前世今生字节跳动最早是在2017年底开始使用ClickHouse的,用于支撑增长分析的业务场景。对于字节跳动而言,增长分析的重要性不言而喻。这是一项十分考验运营团队能力的工作,如何衡量不同运营方法的有... 查看详情

关于bytehouse你想知道的一切,看这一篇就够了

ByteHouse的前世今生字节跳动最早是在2017年底开始使用ClickHouse的,用于支撑增长分析的业务场景。对于字节跳动而言,增长分析的重要性不言而喻。这是一项十分考验运营团队能力的工作,如何衡量不同运营方法的有... 查看详情

[转]关于深度学习,看这一篇就够了

关于深度学习,看这一篇就够了原文地址:http://www.dlworld.cn/XueXiSuanFa/13.html[日期:2016-04-26]来源:36氪 作者:[字体:大 中 小]    编者按:本文作者王川,投资人,中科大少年班校友,现居加州硅谷,个人微信号... 查看详情

android面试老生常谈的view事件分发机制,看这一篇就够了(代码片段)

...,变得更好~。在Android开发当中,View的事件分发机制是一块很重要的知识。不仅在开发当中经常需要用到,面试的时候也经常被问到。如果你在面试的时候,能把这 查看详情

handler看这一篇就够了(代码片段)

...,如果比较熟悉可以直接跳过:通过sendMessage消息机制来发送sendEmptyMessage(int);//发送一个空的消息sendMessage(Message);//发送消息,消息中可以携带参数sendMessageAtTime(Message,long);//未来某一时间点发送消息s 查看详情

关于反爬虫,看这一篇就够了

编者:本文来自携程酒店研发部研发经理崔广宇在第三期【携程技术微分享】上的分享,以下为整理的内容概要。墙裂建议点击视频回放,“现场”围观段子手攻城狮大崔,如何高智商&高情商地完美碾压爬虫。。。关... 查看详情

收集整理,看这一篇就够了

...有侵权,敬请联系我删除,感谢!1.Android图片加载库比较2.Android图片加载机制及其优化3.Android主流网络框架4.android面试题-okhttp内核剖析5.从网络加载一个10M的图片,说下注意事项6.TCP的三次握手与四次挥手理解及... 查看详情

收集整理,看这一篇就够了

...有侵权,敬请联系我删除,感谢!1.Android图片加载库比较2.Android图片加载机制及其优化3.Android主流网络框架4.android面试题-okhttp内核剖析5.从网络加载一个10M的图片,说下注意事项6.TCP的三次握手与四次挥手理解及... 查看详情

关于el-upload看这一篇就够了(代码片段)

下述源码分析基于Elementv2.15.9版本前提在解析源码之前,先阐述其重点使用的两个基础内容:<inputtype="file">使用type=“file”的元素使得用户可以选择一个或多个元素以提交表单的方式上传到服务器上,... 查看详情

关于el-upload看这一篇就够了(代码片段)

下述源码分析基于Elementv2.15.9版本前提在解析源码之前,先阐述其重点使用的两个基础内容:<inputtype="file">使用type=“file”的元素使得用户可以选择一个或多个元素以提交表单的方式上传到服务器上,... 查看详情

关于反爬虫,看这一篇就够了(转)

https://segmentfault.com/a/1190000005840672者:本文来自携程酒店研发部研发经理崔广宇在第三期【携程技术微分享】上的分享,以下为整理的内容概要。墙裂建议点击视频回放,“现场”围观段子手攻城狮大崔,如何高智商&高情商地... 查看详情

jdk11关于java模块系统,看这一篇就够了

继2014年3月Java8发布之后,时隔4年,2018年9月,Java11如期发布,其间间隔了Java9和Java10两个非LTS(LongTermSupport)版本。作为最新的LTS版本,相比Java8,Java11包含了模块系统、改用G1作为默认GC算法、反应式流Flow、新版HttpClient等诸多... 查看详情

分布式事务看这一篇就够了

...物,扣款即产生订单交易。事务的具体定义事务提供一种机制将一个活动涉及的所有操作纳入 查看详情

关于反爬虫,看这一篇就够了

编者:本文来自携程酒店研发部研发经理崔广宇在第三期【携程技术微分享】上的分享,以下为整理的内容概要。墙裂建议点击视频回放,“现场”围观段子手攻城狮大崔,如何高智商&高情商地完美碾压爬虫... 查看详情

json入门看这一篇就够了

什么是JSONJSON:JavaScriptObjectNotation【JavaScript对象表示法】JSON是存储和交换文本信息的语法。类似XML。JSON采用完全独立于任何程序语言的文本格式,使JSON成为理想的数据交换语言S为什么需要JSON提到JSON,我们就应该和XML来进行对... 查看详情

@override看这一篇就够了

...议写上! 二、为什么用既然不写@Override也可以重写父类的方法,那为什么非要“多此一举”写上这个注解呢?使用@Override注解主要有两个好处:1)帮助自己检查是否正确的重写父类方法2)明显的提示看代码的人,这... 查看详情