Java中类的加载机制和反射相关概念

简介: Java中类的加载机制和反射相关概念

本篇文章主要知识点

因为最近在刷面试题,遇到了很多的基础问题都出了错,所以利用空闲时间大肆的回顾下基础,顺便总结出了一些知识点来进行分享,如果能帮助到你请点个赞吧!

1.Java一个类中代码的执行次序

2.当一个子类继承父类时,子类实例化时,子类和父类代码的执行次序

3.final关键词的一些验证

4.反射到底都能获取类的什么东西

下面我们来依次进行试验:

1 Java中代码的执行次序

我们来新建一个类,一个类中的东西也无非就是属性(private、public修饰等等)方法(private、public修饰等等)静态代码块非静态代码块构造方法(有参和无参)

class People {
    private String str = "People";
    private static final String VALUE = "I am people static VALUE";
    public People() {
        System.out.println("people 无参实例化");
    }
    public People(String str) {
        this.str = str;
        System.out.println("people 全参实例化");
    }
    static {
        //System.out.println(str);编译错误
        System.out.println(VALUE);
        System.out.println("I am people static part");
    }
    {
        System.out.println("I am people no static part");
    }
    public void method1() {
        System.out.println("I am people method1");
    }
}
public class article0604 {
    public static void main(String[] args) {
        People people=new People();
    }
}

运行结果:

由此我们知道了一个类中代码的执行机制(次序):

2 子类继承父类时代码的执行次序

下面我们把People作为父类,再创建一个Student子类:

class Student extends People {
    private String str = "Student";
    public Student() {
        System.out.println("student 无参实例化");
    }
    public Student(String str) {
        this.str = str;
        System.out.println("student 全参实例化");
    }
    static {
        System.out.println("I am student static part");
    }
    {
        System.out.println("I am student no static part");
    }
    @Override
    public void method1() {
        System.out.println("I am student method1");
    }
}
public class article0604 {
    public static void main(String[] args)  {
        Student student = new Student();
    }
}

运行结果:

由此我们可以得知:

3 final关键词的一些验证

首先看下Java中对于final关键字的一些解释:

final:用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量

final修饰的类不能被继承:

final修饰的变量子类也不能继承

反射也不行

Class<?> clazz = Class.forName("test0604.Student");
Field[] fields = clazz.getFields();
System.out.println("参数个数:" + fields.length);
for (Field field : fields) {
    System.out.println(field);
}

运行结果:

0

4 反射到底都能获取类的什么东西

我们就以上边Student类来进行测试:

public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        Class<?> clazz = Class.forName("test0604.Student");
        //获取参数
        Field[] fields = clazz.getFields();
        Field[] declaredFields = clazz.getDeclaredFields();
        /*
        clazz.getDeclaredMethods()
        反映由这个class对象表示的类或接口声明的所有字段。 这包括公共、受保护、默认(包)访问和私有字段,但不包括继承字段。
         */
        Method[] declaredMethods = clazz.getDeclaredMethods();
        Method[] methods = clazz.getMethods();
        System.out.println("Declared方法:" + declaredMethods.length);
        System.out.println("public方法:" + methods.length);
        System.out.println("Declared参数:" + declaredFields.length);
        System.out.println("public参数:" + fields.length);
        System.out.println("遍历fields:");
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("遍历declaredFields:");
        for (Field field : declaredFields) {
            System.out.println(field);
        }
        System.out.println("遍历declaredMethods:");
        for (Method d : declaredMethods) {
            System.out.println(d);
        }
        System.out.println("遍历methods:");
        for (Method d : methods) {
            System.out.println(d);
        }

输出结果:

在这里注意下:

clazz.getDeclaredMethods():反映由这个class对象表示的类或接口声明的所有字段。 这包括公共、受保护、默认(包)访问和私有字段,但不包括继承字段。


相关文章
|
7天前
|
存储 SQL 安全
Java 安全性编程:基本概念与实战指南
【4月更文挑战第27天】在当今的软件开发领域,安全性编程是一个至关重要的方面。Java,作为广泛使用的编程语言之一,提供了多种机制来保护应用免受常见的安全威胁。本博客将探讨 Java 安全性编程的基本概念,并通过实际示例来展示如何实现这些安全措施。
15 3
|
7天前
|
Java
【专栏】Java中的反射机制与应用实例
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
2天前
|
Java
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识。入坑JAVA因它的面向对象特性、平台无关性、强大的标准库和活跃的社区支持。
14 2
|
5天前
|
Java 开发者
Java中的异常处理:从基本概念到最佳实践
【4月更文挑战第30天】 在Java编程中,异常处理是确保程序健壮性和稳定性的关键机制。本文将深入探讨Java异常处理的基本概念,包括异常的分类、异常的抛出与捕获,以及如何有效地使用异常来增强代码的可读性和可维护性。此外,我们还将讨论一些关于异常处理的最佳实践,以帮助开发者避免常见的陷阱和误区。
|
5天前
|
存储 Java 编译器
【Java探索之旅】数组概念与初始化指南:动静结合
【Java探索之旅】数组概念与初始化指南:动静结合
14 0
|
5天前
|
XML Java 测试技术
Java异常处理神器:Guava Throwables类概念与实战
【4月更文挑战第29天】在Java开发中,异常处理是保证程序稳定性和可靠性的关键。Google的Guava库提供了一个强大的工具类Throwables,用于简化和增强异常处理。本篇博客将探讨Throwables类的核心功能及其在实战中的应用。
15 2
|
5天前
|
安全 Java 测试技术
利用Java反射机制提高Spring Boot的代码质量:概念与实战
【4月更文挑战第29天】Java反射机制提供了一种强大的方法来在运行时检查或修改类和对象的行为。在Spring Boot应用中,合理利用反射可以提高代码的灵活性和可维护性。本篇博客将探讨Java反射的核心概念,并展示如何通过反射提高Spring Boot项目的代码质量。
21 0
|
6天前
|
Java 测试技术
滚雪球学Java(24):Java反射
【4月更文挑战第13天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
14 0
滚雪球学Java(24):Java反射
|
7天前
|
算法 Java API
Java中的多线程编程:概念、实现与挑战
【4月更文挑战第28天】 在现代软件开发中,多线程编程已成为提高应用性能和响应能力的关键工具。特别是在Java这种广泛使用的编程语言中,多线程不仅增加了程序的并发性,还提升了资源利用率和用户体验。然而,多线程编程也带来了设计复杂性、数据一致性和线程安全等一系列挑战。本文旨在探讨Java多线程的核心概念,展现其实现方式,并讨论在设计和开发过程中可能遇到的技术难题及其解决方案。
|
7天前
|
监控 Java API
Java 模块化设计:概念与实战应用
【4月更文挑战第27天】模块化设计是现代软件开发的关键,它帮助开发者构建可管理、可维护的大型系统。Java 平台的模块化支持始于 Java 9,引入了一种全新的模块系统。
16 3