【Java基础】万字长文深入理解Java反射机制

大厂校招必懂:Java反射机制原理详解(2万字长文) 在Java编程领域,反射(Reflection)是一个核心概念,它允许程序在运行时动态地获取类的信息并操作类的属性和方法。简而言之,反射是程序自我观察和自我修改的能力。通过反射,开发人员可以编写出更加灵活和可扩展的代码,因为反射机制使得程序能够在不预先知道具体类的情况下,对其进行操作。在Java中,反射机制主要通过java.lang.Class类和java.lang.reflect包下的类来实现。Class类代表了Java中的一个类,它包含了类的元数据信息,如类名、父类、实现的接口、属性、方法等。 阅读详情

大家好,我是程序员青戈,一个被Bug耽误了才艺的程序员👦专注于Java领域的知识分享和技术交流,每天会给大家带来Java学习的干货教程📚

微信搜索公众号 Java学习指南,回复 面试 领取一线大厂面试题一套😋加号主微信 xia_qing2012,可以进技术交流学习群一起共同进步哦😊


1. 什么是反射?

1.1 反射概念

我们先看下反射的概念:

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。

简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的全限定名称(例如 com.example.Student),那么就可以通过反射机制来获得类的所有信息。

1.2 举例说明反射机制

那么既然有“反”,就应该有“正”,我们没学反射之前是怎么通过正向过程创建对象的呢?

例如我们想创建一个Student的对象,在这之前我们是不是应该创建Student类:

public class Student {
    private String name; // 姓名
    private Integer age;  // 年龄
    private String address;  // 地址

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

然后我们通过new的方式创建对象,并调用其方法:

Student student = new Student();  // 创建对象
student.setAge(19);  // 执行setAge方法
Integer age = student.getAge();  // 获取学生的年龄
System.out.println(age);

好,到此为止我们通过正向的方式创建了一个Student对象,那么通过反射怎么创建Student对象?我们来看下:

Class<?> clazz = Class.forName("Student");  //获取Student类
Object o = clazz.newInstance();    // 通过类创建对象
Method setAgeMethod = clazz.getMethod("setAge", Integer.class);  // 获取setAge方法。第一个参数是方法名称,第二个参数是方法的参数类型列表,如果有多个参数可以传多个参数的类型
setAgeMethod.invoke(o, 19);  //  执行setAge()方法
Method getAgeMethod = clazz.getMethod("getAge");  // 获取getAge方法
Object age = getAgeMethod.invoke(o);  // 执行getAge方法
System.out.println(age);

以上两种方法都可以打印年龄19:

这就是反射,在程序运行的时候动态创建类的实例,并通过实例调用类的方法。

1.3 更深入地看下反射机制

java源文件从创建到运行会经历3个阶段,分别是源码阶段、Class类对象阶段和运行阶段。在java文件编译成class文件后,通过类加载器将class的信息加载进内存,在内存中class字节码文件被描述成3种对象信息,分别是成员变量对象、构造方法对象、成员方法对象,它们都是多个,所以是数组。这个Class对象阶段就是反射机制,我们通过Class可以得到类的所有信息,创建对象和调用其成员方法。

2. 为什么学反射?

2.1 利用反射分工协作

从上面的例子我们可以看出,如果你事先创建好了Student类,那么你可以直接创建Student对象并调用其方法,那么如果我和另外一位老铁分开开发程序,这个Student类是他写的,我们彼此开发完全独立,我需要在我的程序中创建Studnet对象,然后调用Student方法获取学生的年龄,这个时候可能这位老铁还没有完成Student类的开发,这怎么办?

这就用到了反射了,我在开发程序的时候只需要跟他约定好Studnet类的信息,例如类名称,字段名称、方法名称,我就可以通过反射的机制在他还未写Studnet类的时候动态创建Studnet对象并调用其方法了。等他的Studnet类完成创建之后,我们的代码合并部署运行,我就可以调用到Student的方法了。

2.2 Spring中的反射

其实在框架内部处处都是反射的应用,反射是框架的灵魂。比如我们最常用的Spring框架,在定义一个bean的时候我们可能会这么做:

<bean id="studentBean" class="com.example.Student"/>

在xml文件中定义一个bean,告诉Spring我需要一个Student对象,这个对象的名称是com.example.Student,那么Spring就会通过我们上面那种方式去生成对象:

Class clazz = Class.forName("com.example.Student");  // 通过名称得到Class
Object stuObj = clazz.newInstance();   // 生成对象

生成完对象之后,Spring会把这个对象放在一个容器中,在实际需要的时候通过@Autoware或者@Resource等注解的方式去获取对象,或者通过ApplicationContext获取bean对象。

2.3 Dubbo中的反射

我们常用的RPC框架,例如DUBBO,在接口调用的时候,也是应用反射机制。

RPC框架根据客户端的请求 :接口名称(interface)、方法名称(method)、参数类型(paramtype)、参数(params)等进行反射,dubbo接口之间通信的机制大概是这样的:

通过反射我们可以实现上面的流程:

String className = request.getClassName();  // 获取类名称

Class<?> c = Class.forName(className);  // 得到Class信息

Object serviceBean = c.newInstance();   // 创建对象

String methodName = request.getMethodName();  // 得到调用的接口名称

Class<?> paramTypes = request.getParamTypes();  // 获取接口的参数类型

Object[] params = request.getParams();   // 得到消费方调用接口的参数

Method method = c.getMethod(methodName, paramTypes); // 得到接口

method.invoke(serviceBean , params);  // 执行接口调用

2.4 IDEA中的反射

再比如我们在写代码的时候,创建一个字符串对象,调用其方法,我们是不是通过 ".“来获取方法的?

你看通过”."我们可以看到String对象的所有方法信息,这是怎么做到的?其实这也是利用了Java的反射机制。

idea在运行期间,通过反射获取到了String对象的全部方法,然后列举成一个列表,描述了方法的名称、参数和返回值,我们在使用的时候可以直接选择想要的方法,非常方便。

2.5 反射在动态代理中的应用

2.5.1 JDK动态代理

Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:

  1. Interface InvocationHandler:该接口中仅定义了一个方法Object,invoke(Object obj,Method method, Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。这个抽象方法在代理类中动态实现。
  2. Proxy:该类即为动态代理类。
2.5.2 Cglib动态代理

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。JDK代理要求被代理的类必须实现接口,有很强的局限性。而CGLIB动态代理则没有此类强制性要求。简单的说,CGLIB会让生成的代理类继承被代理类,并在代理类中对代理方法进行强化处理(前置处理、后置处理等)。在CGLIB底层,其实是借助了ASM这个非常强大的Java字节码生成框架。

2.5.3 Javassist代理

一种是使用代理工厂创建,另一种通过使用动态代码创建。使用代理工厂创建时,方法与CGLIB类似,也需要实现一个用于代理逻辑处理的Handler;使用动态代码创建,生成字节码,这种方式可以非常灵活,甚至可以在运行时生成业务逻辑。

3. 怎么学反射?

最简单粗暴的方法就是对着API撸!


3.1 class对象

获取class对象的三种方式

  • Class.forName("全类名"),将字节码文件加载进内存,获取class对象;
  • 类名.class,通过类的class属性获取;
  • 对象.getClass(),getClass方法在Object类中定义的,所以对象都有这个方法。
Class clazz = Class.forName("Student");   // 可能会抛出ClassNotFoundException异常
Class clazz1 = Student.class;  
Class<?> clazz2 = new Student().getClass();

注意,同一个字节码.class文件只会被加载一次,无论哪种方式获取的Class对象都是同一个。

3.2 成员变量

  • getFields(), 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
  • getField(String name),返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
  • getDeclaredFields(),返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
  • getDeclaredField(String name), 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。

我们来具体演示下。

为了达到演示效果,Studnet类稍作修改,有四个属性,分别使用public、protected、default、private来修饰。

public class Student {
    public String name;
    protected Integer age;
    String address;
    private String phone;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

先看下getFields和getField方法

Class clazz = Student.class;
 Field[] fields = clazz.getFields();
 for (Field field : fields) {
     System.out.println("getFields======" + field);
 }
 Field field = clazz.getField("name");
 System.out.println("getField name======" + field);
 Field field1 = clazz.getField("age");
 System.out.println("getField age======" + field1);

运行结果:

我们可以看到,getFields只获得了Student的name属性,由于age属性是protected修饰的,所以getField(“age”)抛出了NoSuchFieldException的异常。

那么怎么获得非public修饰的属性?我们可以通过getDeclaredFields和getDeclaredField(‘name’)两个方法来获取:

Field[] declaredFields = clazz.getDeclaredFields();  // 获取所有已声明的属性
for (Field declaredField : declaredFields) {
    System.out.println("getDeclaredFields======" + declaredField);
}
Field ageField = clazz.getDeclaredField("age"); // 获取指定名称的已声明的属性
System.out.println("getDeclaredField age=========" + ageField);

运行结果

可以看到我们拿到了类的所有已声明字段,那么拿到了这些字段我们就可以获取对象对应字段的值了,来试下:

Student student = new Student();   // new一个Student对象
student.setName("小明");   // 设置属性值
student.setAge(20);
student.setAddress("上海市");
student.setPhone("13011220099");
Field[] declaredFields = clazz.getDeclaredFields();
for (Field declaredField : declaredFields) {
    System.out.println("field=" + declaredField.getName() +  ",value=" + declaredField.get(student));  // 获取属性值
}

那么结果会是什么样子的?

可以看到,前3个属性的值打印出来了,也就是说非private修饰的属性可以通过declaredField.get(obj)的方式从对象中获取其属性值,但是private修饰的属性phone在获取属性值的时候会抛出java.lang.IllegalAccessException异常,无法访问。

那么private修饰的属性我们如何从对象中获取其属性值?我们需要加上这一句:

// 忽略访问权限修饰符的安全检查
declaredField.setAccessible(true);

忽略了访问权限修饰符的权限限制,我们就可以通过反射获取任意属性的属性值了。

注意:getDeclared***同样适用于Constructor和Method,分别是getDeclaredConstructor()和getDeclaredMethod(),通过setAccessible(true)这种方式可以忽略其访问限制,从而可以使用类私有的属性、构造器和方法。

3.3 构造方法

  • getConstructor(Class<?>… parameterTypes),返回一个 Constructor对象Constructor,该对象反映 Constructor对象表示的类的指定的公共 类函数。
  • getConstructors(),返回包含一个数组 Constructor对象Constructor<?>[],反射由此表示的类的所有公共构造类对象。
  • getDeclaredConstructor(类<?>… parameterTypes),返回一个 Constructor对象Constructor,该对象反映 Constructor对象表示的类或接口的指定 类函数。
  • getDeclaredConstructors(),返回一个反映 Constructor对象表示的类声明的所有 Constructor对象的数组类Constructor<?>[]。

获取构造器的作用是为了new对象,可以通过有参、无参的构造器创建对象,无参构造器创建的对象等同于Class提供的newInstance方式创建对象:

Constructor constructor = clazz.getConstructor(String.class, Integer.class);  // Constructor 有参构造
Object stu = constructor.newInstance("张三", 12);  // 创建对象
System.out.println("Constructor有参构造对象======" + stu);

Constructor constructor1 = clazz.getConstructor(); // Constructor 无参构造
Object stu1 = constructor1.newInstance();  // 创建对象
System.out.println("Constructor无参构造======" + stu1);

Object stu2 = clazz.newInstance();  // Constructor无参构造创建对象简写形式:Class创建对象
System.out.println("Class无参构造======" + stu2); 

运行结果:

3.4 成员方法

  • getMethod(String name, Class<?>… parameterTypes),获取一个指定名称和参数类型的public修饰的方法对象。
  • getMethods(),获取所有的public修饰的方法列表。
  • getDeclaredMethod(String name, Class<?>… parameterTypes),获取已声明的指定名称和参数类型的的成员方法。
  • getDeclaredMethods()),获取已声明的所有成员方法。

我们还是用Student类来演示,先给Student加上两个成员方法:

public void eat() {
    System.out.println("eat");
}

public void eat(String food) {
    System.out.println("eat " + food);
}

现在来利用反射调用下这两个方法:

Student student = new Student();  // 创建Student对象
Method eatMethod = clazz.getMethod("eat");  // 获取eat方法对象
eatMethod.invoke(student);    // 执行eat方法

Method eatMethod1 = clazz.getMethod("eat", String.class);  // 获取有参eat方法对象
eatMethod1.invoke(student, "香蕉");  // 执行有参eat方法

运行结果:

那么getMethods是不是获取Studnet定义的成员方法呢?

Method[] methods = clazz.getMethods();
for (Method method : methods) {
    System.out.println(method);
}

运行结果:

可以看到Object类定义的成员方法也被打印出来了,所以这里我们要注意getMethods()方法会获取类自身以及Object类中定义的所有成员方法。

4. 反射的优缺点

4.1 优点

反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类;

4.2 缺点

  1. 性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。
  2. 使用反射会模糊程序内内部逻辑:程序员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。

关于作者

程序员青戈,5年一线Java开发经验,先后在IBM、阿里、科大讯飞踩坑~

微信搜索:Java学习指南 关注我的原创公众号

感谢大家的阅读,创作不易,能否请您小手点一点下方的 一键三连 支持一下作者呢😊谢谢~

《大数据最全面试题-Offer直通车》目录 做好这些不用担心试用期不通过:程序员入职新公司如何快速上手项目本人遇到大数据面试题和参考答案(超过1万字精华版)大数据面试英文自我介绍参考(万字长文)大数据运维应用场景面试题汇总及参考答案(持续更新)万字数据仓库面试题及参考答案数据仓库数据质量监控和处理方法最佳实践数据仓库建模方法万字详解Doris的3种数据模型详解和数据仓库每一层的模型选用大数据面试临阵磨枪不知看什么?看这份心理就有底了-大数据常用技术栈常见面试100道题最全Hive面试题2024年(2万字详解)Elasticsearch 面试题及参考答 阅读详情

相关推荐

如何使用Calibre PERC抽出 点到点/p2p 电阻

@[TOC](如何使用Calibre PERC抽点到点(p2p)电阻) 一、前言 需要实现的功能是从gds中抽出net的点到点的电阻。如下图这样。 二、准备工作 lvs rule pex rule(必要时可以自己定义RC rule) gds p2p点的坐标 定义prode.defs 因为p2p的点是变化的,所以每次prode定义都要重新出,对应的perc rule也是根据每个p2p点的定义来的,perc rule也是每次都要重新出。如果需要可以写一个脚本自动出这些定义文件。 PROBE_POINTS

kobayashiyou的博客 1万+

java中getClass()方法简介

getClass() 返回此 Object 的运行时类。 一、示例代码: public class Test { public static void main(String[] args) { Person p = new Person(1,"刘德华"); System.out.println(p.getClass()); S

expect521的博客 18万+

HttpClient跳过HTTPS证书验证的3种实战方法(含完整代码示例)

本文详细介绍了HttpClient跳过HTTPS证书验证的3种实战方法,包括自定义TrustManager、SSLContext配置和HttpClientBuilder高级定制,并提供完整代码示例。这些方法适用于开发和测试环境,帮助开发者快速解决自签名证书或未认证证书导致的HTTPS请求失败问题,但需注意生产环境的安全风险。

weixin_29213655的博客 528

java中的getClass()方法的用法

getClass的定义以及使用方法getClass()的作用getClass()使用方式简单代码演示其他相关用法1.getName()和getCanonicalName()2.getDeclaredMethod()3.还有很多对class对象进行操作的方法 getClass()的作用 getClass() 返回此 Object 的运行时该对象的类. 该方法返回一个Class对象, 可以通过该对象可...

996程序员的自我修养 1万+

基于深度学习的图像修复系统,GAN图像修复,图像修复算法研究,并实现系统登录和注册,全网独发

近年来,深度学习已成为计算机视觉领域的研究热点,基于深度学习的图像修复技术弥补了传统修复方法长期存在的不足,显著提高了生成结果的质量。深度学习是指模仿人脑机制设计的具有深层结构的神经网络。深度学习作为一种表征学习,通过模仿人脑神经元之间的信息传递方式来学习输入数据的特征,并找到输入和输出数据之间的映射关系。通过在图像修复中应用深度学习技术,可以准确学习图像的语义信息,然后根据信息预测缺失的内容,大大克服了传统修复算法的不足,使结果更具逻辑性。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 8253

16、AI与无人机助力紧急器官移植及医疗物资运输

本文探讨了AI与无人机(UAV)集成模型在紧急器官移植和医疗物资运输中的应用。传统运输方式受限于交通、时间和环境因素,而基于图神经网络(GNN)的AI-UAV系统可实现高效、智能、全天候的医疗物资配送,具备实时温湿度监控、自动导航和适应复杂地形等优势。文章分析了该模型在血液、器官运输中的关键作用,展示了其在澳大利亚、中国、美国等国的实际应用案例,并通过表格与流程图说明运作机制。同时,文章还探讨了技术、法规和社会层面的挑战及应对策略,展望了未来技术融合、应用拓展和国际合作的发展趋势,凸显其在全球医疗物流中的广

lll78的博客 102

getClass和.class作用

Java基础

记录,是一种习惯;坚持,是一种品质。 1053

【STM32项目】基于stm32智能鱼缸控制系统的设计与实现(完整工程资料源码)

随着现代化经济的快速发展,物质条件富足的人开始追求精神富足,越来越多的人通过饲养观赏鱼来充实生活、释放压力,但并非所有饲养者都有时间和经验来管理好鱼缸。一种由单片机控制,可实时检测和调节鱼缸环境,可把鱼缸环境实时反映给用户并能被用户远程操控的系统,可以解决养鱼成活率低、耗费时间和精力、参与感不强等诸多难题。

嵌入式技术开发 7349

java getclass方法_JAVA-初步认识-第十一章-object类-Getclass方法

一.只看名字,是获取类的意思。什么叫运行时类?现在进行一个前期的铺垫介绍,在创建对象前先要有class文件,这是个字节码文件。先要加载class文件,后面才能接着运算。现在举了一个例子,如下Demo类和Class类,对它们的共性进行抽取。类文件都有一个共性特点就是,它里面都是源文件中所描述的那些成员,只不过类文件将它们变成了字节码,变成了另外一种符号形式而已。它们既然有共性,那就可以进行抽取(但这...

weixin_29710403的博客 2317

【现代控制理论期末考点】

现代控制理论期末考点,适用于 SEU Automation

【人工智障 | 计算鸡视觉 | 机器孩】 1444

Python爬虫分析二手交易平台商品定价合理性:基于多维度数据挖掘与机器学习

本文针对二手交易平台商品定价合理性问题,设计并实现了一个基于Python的多技术融合爬虫系统,结合Scrapy框架、Selenium自动化测试工具、Anti-Scraping对抗技术以及机器学习算法,对国内主流二手交易平台(闲鱼、转转等)进行大规模数据采集与分析。系统实现了商品信息的多维度采集、价格合理性模型构建、可视化展示等功能,为二手商品买卖双方提供科学的定价参考。实验结果表明,该系统能够有效识别定价异常商品,准确率达到89.7%,具有较高的实用价值。关键词:Python爬虫;二手交易;定价分析;

2201_76125261的博客 297

java中getClass()方法简介 (转载自大神)

转载自这位大佬 https://blog.youkuaiyun.com/expect521/article/details/79139829 学习到了很多,棒棒哒! getClass() 返回此 Object 的运行时类。 public class Test { public static void main(String[] args) { Person p = new Person(1,"刘德华"); System.out.println(p.getClass()); .

Daryl的博客 1372

OpenClaw实战系列07:定时任务与自动化工作流实战——让AI从“被动响应”到“主动执行”

通过本文的学习,你已经将 OpenClaw 从“被动应答”升级为“主动执行”的自动化引擎。定时简报:每天8点自动生成行业简报推送飞书/钉钉GitHub事件触发:PR合并自动触发Code ReviewAgent间协作:数据采集→分析→报告全自动流水线系统监控:定时检查服务器状态,异常自动告警核心收获掌握 OpenClaw 内置 Cron 系统的三种调度模式学会 Webhook 配置和事件触发机制理解 Agent 间通信的两种方式(sessions_spawn / sessions_send)

PeterPan的博客 691

万字长文复习 Java 基础

万字爆肝 Java 基础,带你一起重新复习 Java 基础。

大大怪将军的博客 945

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深入剖析Java注解:从原理到实践的万字长文,带你彻底掌握!

在Java开发的世界中,注解(Annotation)早已成为不可或缺的一部分。从Spring的@Autowired到Lombok的@Data,再到自定义注解,注解无处不在,极大简化了代码,提高了开发效率。那么,注解到底是什么?它的底层原理如何?如何在实际项目中发挥最大价值?今天,我用一篇超详细的万字长文,带你从零到精通,彻底搞懂Java注解的方方面面!这篇文章不仅适合Java初学者,也适合想深入理解注解底层原理的中高级开发者。

记录学习路上的每一个 “啊哈!” 时刻 欢迎交流,共同进步! 3785

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

两万字长文!关于Java你不知道的那些事之Java注解和反射

点击上方 "后端架构师"关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!关注订阅号「后端架构师」,收看更多精彩内容每日英文When you are free fr...

程序员小乐 398

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

万字长文轻松彻底入门spring,各大公司Java面试题超详细总结

类加载器工作机制: 1.装载:将Java二进制代码导入jvm中,生成Class文件。 2.连接:a)校验:检查载入Class文件数据的正确性 b)准备:给类的静态变量分配存储空间 c)解析:将符号引用转成直接引用 3:初始化:对类的静态变量,静态方法和静态代码块执行初始化工作。 双亲委派模型:类加载器收到类加载请求,首先将请求委派给父类加载器完成 用户自定义加载器->应用程序加载器->扩展类加载器->启动类加载器。 友情链接:深入理解Java虚拟机笔记—双亲委派模型 友情链接:JVM类加.

m0_56255097的博客 260

万字长文丨7个经典问题,助你拿下Java面试(建议收藏)_你需要存储元素到某种数据结构中,而且要确保元素在自然队列中没有重复(1)

程序本身的问题,也就是抛出的运行时异常最好是就地解决。接下来就会加大难度,考察你对Java语言特性的掌握深度,以下考题别看耳熟能详,却很能见功底,面试者完全可以侃侃而谈一番,但如果说了半天还是没能准确道出实质的话,那么,就会给面试官留下知识的探索不够深入的印象。2、异常处理机制在实际工作中会经常被用来实现将程序的异常处理代码和正常业务代码分离,异常处理代码的错误要么高调抛出以让开发者定位处理或低调捕获从而不影响代码的正常执行,从而提高程序的健壮性,现在异常机制已经成为判断一门编程语言是否成熟的标准。

2401_84181403的博客 896

40000+字超强总结?阿里P8把Java全栈知识体系详解整理成这份PDF

40000 +字长文总结,已将此文整理成PDF文档了,需要的朋友点赞支持一下吧。 全栈知识体系总览 Java入门与进阶面向对象与Java基础 Java 基础 - 面向对象 Java 基础 - 知识点 Java 基础 - 图谱 & Q/A 基础知识点复习完了以后,我们需要深入的理解Java中的一些基础机制: Java 基础 - 泛型机制详解 Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了“伪泛型

jjc4261的博客 4093

Java 全栈知识体系( PDF 可下载)

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

java1024p的博客 347

Java 全栈知识体系

40000 +字长文总结。 面向对象与Java基础 Java 基础 - 面向对象Java 基础 - 知识点Java 基础 - 图谱 & Q/A基础知识点复习完了以后,我们需要深入的理解Java中的一些基础机制:Java 基础 - 泛型机制详解Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了“伪泛型”的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的

weixin_70730532的博客 8182

Go、Java与C语言反射机制深度对比:原理、实现与实战避坑

反射是程序在运行时检查和动态操作自身类型信息的能力,属于元编程的核心技术。其原理是通过语言运行时或手动构建的元数据系统,在编译后保留或重建类型信息,从而支持动态类型操作。这项技术的核心价值在于为框架、库和通用工具提供灵活性,避免了大量重复的模板代码,是构建高效基础设施的关键。在应用场景上,反射广泛用于JSON/XML序列化、Web框架参数绑定、ORM映射以及依赖注入容器等。例如,在JSON序列化中,反射能动态解析结构体字段;在Web框架中,它自动将请求数据绑定到目标对象。本文聚焦于Go语言的reflect.

weixin_30617737的博客 343

一文带你深入理解 Spring 事务原理

Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); ...

勇往直前的专栏 355

Spring-IOC与AOP深度解析-从手写迷你Spring容器说起

Spring IOC 与 AOP 深度解析,从手写迷你 Spring 容器说起

YckerY的博客 447
上一篇: 【Java基础】异常?NullPointException?世界上怎么会存在这种东西?
下一篇: 一文带你搞懂Lambda表达式
程序员青戈
程序员青戈 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 3万+粉丝 250原创
评论 43
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员青戈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值