首页 > 其他分享 >类加载器和反射

类加载器和反射

时间:2024-10-19 16:32:00浏览次数:1  
标签:反射 String System println 加载 id out

第十章——类加载器和反射

1、类的加载

类的加载
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。
加载 
就是指将class文件读入内存,并为之创建一个Class对象。
任何类被使用时系统都会建立一个Class对象。
连接
验证 是否有正确的内部结构,并和其他类协调一致
准备 负责为类的静态成员分配内存,并设置默认初始化值
解析 将类的二进制数据中的符号引用替换为直接引用
初始化 就是我们以前讲过的初始化步骤

类初始化时机:   
创建类的实例
访问类的静态变量,或者为静态变量赋值
调用类的静态方法
使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
初始化某个类的子类
直接使用java.exe命令来运行某个主类
    
类加载器:
类加载器
负责将.class文件加载到内存中,并为之生成对应的Class对象。
虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。
类加载器的组成
Bootstrap ClassLoader 根类加载器
Extension ClassLoader 扩展类加载器
Sysetm ClassLoader 系统类加载器    
    
类加载器的作用:    
Bootstrap ClassLoader 根类加载器
也被称为引导类加载器,负责Java核心类的加载
比如System,String等。在JDK中JRE的lib目录下rt.jar文件中
Extension ClassLoader 扩展类加载器
负责JRE的扩展目录中jar包的加载。
在JDK中JRE的lib目录下ext目录
Sysetm ClassLoader 系统类加载器
负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径
    
反射:    
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
获取构造方法
		getConstructors
		getDeclaredConstructors
创建对象
		newInstance()
		con.newInstance(“zhangsan", 20);
获取所有成员
		getFields,getDeclaredFields
获取单个成员
		getField,getDeclaredField
修改成员的值
		set(Object obj,Object value)将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
获取所有方法
		getMethods
		getDeclaredMethods
获取单个方法
		getMethod
		getDeclaredMethod
暴力访问
		method.setAccessible(true);    
    
    
public class StudentDemo {
    public static void main(String[] args) throws Exception{
        //通过反射获取一个class文件对应Class对象
        //方式1:在已经有对象的前提下获取
//        Student student = new Student();
//        Class<? extends Student> c1 = student.getClass();
//        Class<? extends Student> c2 = student.getClass();
//        System.out.println(c1==c2);

        //方式2:可以直接通过类名的方式获取
//        Class<Student> c1 = Student.class;
//        Class<Student> c2 = Student.class;
//        System.out.println(c1==c2);

        //方式3:Class.forName()
        Class<?> c1 = Class.forName("com.shujia.day20.Student");
//        Class<?> c2 = Class.forName("com.shujia.day20.Student");
//        System.out.println(c1==c2);

        // 获取类中的构造方法并使用
        // getConstructor() 只能获取某一个公共构造方法
        // public Constructor<T> getConstructor(Class<?>... parameterTypes)
        Constructor<?> cons1 = c1.getConstructor();
//        System.out.println(cons1);
//        Constructor<?> cons2 = c1.getConstructor(String.class,String.class);
//        System.out.println(cons2);
        Constructor<?> cons2 = c1.getDeclaredConstructor(String.class, String.class);
        System.out.println(cons2);
        Constructor<?> cons3 = c1.getDeclaredConstructor(String.class);
        System.out.println(cons3);
        //如何使用获取到的构造方法呢?
        //public T newInstance(Object ... initargs)
        Object o = cons1.newInstance();
        System.out.println(o);
        cons3.setAccessible(true);
        Object o1 = cons3.newInstance("1001");
        System.out.println(o1);

        // 获取类中的成员变量并使用
        //getField 只能获取公共的成员变量
        Field like = c1.getField("like");
//        Field id = c1.getField("id");
        Field id = c1.getDeclaredField("id");
        // 给对象o1中成员变量like进行赋值操作
        like.set(o1, "骑自行车");
        System.out.println(o1);
        id.setAccessible(true);
        id.set(o1,"1002");
        System.out.println(o1);

        // 获取类中的成员放啊并使用
        Method fun1 = c1.getMethod("fun1");
        System.out.println(fun1);
        Method fun11 = c1.getMethod("fun1",String.class);
        System.out.println(fun11);
//        Method fun3 = c1.getMethod("fun3");
//        System.out.println(fun3);
        Method fun3 = c1.getDeclaredMethod("fun3");
        System.out.println(fun3);
        //使用成员方法
        fun1.invoke(o1);
        fun3.setAccessible(true);
        fun3.invoke(o1);

    }
}

============================================================
public class Student {
    private String id;
    String name;
    protected int age;
    public String like;

    public Student() {
    }

    private Student(String id) {
        this.id = id;
    }

    Student(String id, String name) {
        this.id = id;
        this.name = name;
    }

    protected Student(String id, String name, int age, String like) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.like = like;
    }

    public void fun1(){
        System.out.println("这是公共的无参成员方法");
    }

    public void fun1(String s){
        System.out.println("这是有参数成员方法"+s);
    }

    private void fun3(){
        System.out.println("这是私有的无参成员方法");
    }

    private void fun3(String s){
        System.out.println("这是私有的有参数成员方法"+s);
    }

    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", like='" + like + '\'' +
                '}';
    }
}

标签:反射,String,System,println,加载,id,out
From: https://www.cnblogs.com/snzjz/p/18475844

相关文章

  • ArkWeb页面拦截与自定义响应 - 控制加载过程
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。简介在Web应用开发中,有时我们需要对......
  • ArkWeb页面预加载与缓存 - 提升用户体验
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。简介在Web应用开发中,页面加载速度和......
  • 使用Web组件加载页面
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/......
  • ArcGIS无插件加载(无偏移)在线天地图高清影像与街道地图指南
    在地理信息系统(GIS)的应用中,加载高清影像与街道地图对于地图制图、影像查阅、空间数据分析等工作至关重要。天地图作为官方出品的地图服务,以其标准的数据、较快的影像更新速度等特点受到广泛欢迎。以下是如何在ArcGIS中无插件加载(无偏移)天地图高清影像与街道地图的具体步骤。......
  • C#反射技术(高级技术)
    一‘、介绍C#语言的两次编译1:C#语言->编译器编译exe/dll(微软的中间语言IL)->当启动exe文件时(JIL编译器,立即编译IL,变成公共言运行时(CLR))->根据电脑操作系统,编译成机器码2:IL也是一种面向独享语言,但不好阅读3:metadata:元数据(数据清单)描述了DLL/exe里各种信息编译器编译exe/dll......
  • transformers 推理 Qwen2.5 等大模型技术细节详解(一)transformers 初始化和对象加载(
    上周收到一位网友的私信,希望老牛同学写一篇有关使用transformers框架推理大模型的技术细节的文章。老牛同学刚开始以为这类的文章网上应该会有很多,于是想着百度几篇质量稍高一点的回复这位网友。结果,老牛同学搜索后发现,类似文章确实不少,但是总觉得不太满意,要么细节深度不够,要么......
  • go 反射 遍历对象属性 切片 Map
    packagemainimport"fmt"import"reflect"funcmain(){p1:=Person{Name:"test1",Age:20,Address:"1323"}p2:=Person{Name:"demo2",Age:24,Address:"adsd"}varlist[]*Pers......
  • Java中的反射机制,如何应用反射?
    目录1.类比“万能钥匙”来理解反射机制2.反射机制的优点有哪些?3.代码示例4.扩展知识5.反射的性能考虑        Java的反射机制是指在运行时获取类的结构信息(如方法、字段、构造函数),并操作对象的一种机制。反射机制提供了在运行时动态创建对象、调用方法、......
  • 双亲委派机制以及类加载过程就是这样啊
    类加载过程:简洁来说就是将我们的已经完成编译的class字节码文件通过类加载器到我们JVM的内存运行时数据区成为我们可以在程序中可以使用的class对象,而类加载器就是通过双亲委派机制来实现的,这个也是反射的底层实现的原因具体流程: 加载链接 初始化加载:就是通过类加......
  • ArkWeb页面加载与浏览记录导航 - 基础操作
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。简介在ArkWeb框架中,页面加载和浏览记......