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对象表示的类或接口声明的所有字段。 这包括公共、受保护、默认(包)访问和私有字段,但不包括继承字段。


相关文章
|
5天前
|
安全 Java API
Java反射(Reflection)的技术性文章
Java反射(Reflection)的技术性文章
20 1
|
6天前
|
Java
Java中的多线程编程:概念、实现与挑战
【5月更文挑战第30天】本文深入探讨了Java中的多线程编程,涵盖了多线程的基本概念、实现方法以及面临的挑战。通过对Java多线程编程的全面解析,帮助读者更好地理解多线程在Java中的应用,提高程序的性能和效率。
|
19天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
48 7
|
21天前
|
Java C++
Java反射的简单使用
Java反射的简单使用
25 3
|
4天前
|
缓存 安全 Java
【Java——反射机制详解】
RTTI(Run-Time Type Identification)运行时类型识别。在《Thinking in Java》一书第十四章中有提到,其作用是在运行时识别一个对象的类型和类的信息。主要有两种方式:一种是“传统的”RTTI,它假定我们在编译时已经知道了所有的类型;另一种是“反射”机制,它允许我们在运行时发现和使用类的信息。 反射就是把java类中的各种成分映射成一个个的Java对象 例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
|
6天前
|
JSON Java 数据库连接
Java的反射
Java的反射
|
7天前
|
存储 Java 数据库
【Java探索之旅】包管理精粹 Java中包的概念与实践
【Java探索之旅】包管理精粹 Java中包的概念与实践
6 0
|
7天前
|
存储 安全 Oracle
Java基础概念及使用的技术类文章
Java基础概念及使用的技术类文章
21 1
|
11天前
|
存储 分布式计算 Java
深入探究JAVA编程语言:概念、应用与实例分析
**JAVA**是广泛应用的高级编程语言,以其易学性、跨平台能力和高效的性能著称。它采用面向对象编程,强调封装、继承和多态,且具备平台无关性、内置安全性和多线程支持。JAVA广泛应用于Web开发(如JSP、Servlet)、移动应用(Android开发)、大数据处理(Hadoop、Spark)和桌面应用。通过一个计算两数之和的简单示例,展示了JAVA的易读性和面向对象特性,帮助读者理解JAVA在实际开发中的运用。
|
16天前
|
Java 程序员 API
Java 8 Lambda 表达式和Stream API:概念、优势和实战应用
【5月更文挑战第20天】在Java 8中,Lambda 表达式和Stream API是两个非常强大的特性,它们显著改变了Java程序员处理数据和编写代码的方式。本篇技术文章将深入探讨这些特性的概念、优点,并提供实战示例,帮助理解如何有效地利用这些工具来编写更简洁、更高效的代码。
34 6