一篇文章彻底搞懂Java的大Class到底是什么

九路 等级 862 2 2

作者在之前工作中,面试过很多求职者,发现有很多面试者对Java的 Class 搞不明白,理解的不到位,一知半解,一到用的时候,就不太会用。

因为自己本身以前刚学安卓的时候,甚至做安卓2,3年后,也是对 java的 Class不是太清楚,所以想写一篇关于Java Class 的文章,没有那么多专业名词,希望用通俗的语言能把Java的 Class 这个概念讲明白,理解了Class后,Java的反射也就好理解多了。

Class很容易,保证看了就明白,我们先来熟悉一个最基础的概念,什么是类?

什么是类?

这个想必所有的学过面向对象编程语言的同学应该都知道,下面给出正式一点的描述 类就是具备某些共同特征的实体的集合

比如下面定义一个 Student 类

class Student{
   String name;
   int age;

   public void learn(){
       System.out.println("正在学习");
   }

   public int getAge(){
       return age;
   }

   public void hello(String message){
      System.out.println(message);
   }
}

所有的学生都有一姓名,都有年龄,都要去学习,这些都学生的共性

那么既然所有的学生都有一些公共的特性,那么我们Java(其它语言也一样)语言中,所有的类是不是也都有公共的特性呢?

是不是不太明白?所有的类都有公共的特性? 是的?没听错 我们再定义一个类Book,如下

class Book{
   private float price;
   private String author;
}

所有的书都有 价格,作者等公共的特性(这里为了简单,例子尽可能代码少点)

所以,不管是上面的Student,Book类,还是Java语言中的自带类比如String

所有的类,都有下面的一些共性:

  • 所有的类,都有一个类名:比如上面的 Student, BookString类,再加上包名,假如包名是 com.test , 那么这些类的名字就是 com.test.Student , com.test.Book, com.test.String
  • 所有的类,都有0个或者多个字段,比如上面的 name,age,price,author
  • 所有的类,都有0个或者多个方法,比如上面的learn()
  • 所有的类,都有修饰符,比如public,private,protected
  • 所有的类,都有0个或者多个静态方法
  • 等等等

Class到底是什么?

通过上面的分析我们知道,所有的类都有一些公共特性,那么我们就定义一个类,来描述这些公共特性,我们暂且把这个类起个类名,叫 Info

其实我们这里的Info类,就是java中的Class,java中的Class其实就是个普通的类而已,和其它的类没什么不一样的。不信看看Class定义

一篇文章彻底搞懂Java的大Class到底是什么

是不是就是一个普通的类,我们把继承关系去掉,是不是就是下面这样了

public class Class {
    ....
}

可不就是个普通的类嘛,只不过类名也叫Class,和java中的关键字class,只是首字母大写了而已,要我说当初就不应该起名叫Class,应该叫Type,就不会有那么多人误解了,就不会有人把Classclass这两个弄的晕头转向的傻傻分不清了。

总之一句话:Class就是一个普通的类,这个类描述的是所有的类的公共特性

Class类能干什么?

了解Class类能干什么之前,我们先来扩展一些其它的东西

既然上面我们知道了,所有的类都是有公共特性的,我们定义了一个叫Class的类来描述这些公共特性

那么是不是所有的类的方法,所有的类的字段,是不是也有公共的特性? 答案是的

是不是有点迷糊? 不要怕,很简单,举个例子就知道了。 还是上面的Student,Book类,

  • 所有的类的字段,都有名字。 比如Book类中的price字段,它的名字是不是"price"
  • 所有的类的字段,都有类型。 比如Book类中的price字段,它的类型是 float
  • 所有的类的字段,都有修饰符。 比如Book类中的price字段,它的修饰符是 private

所以这些类的字段公共的特性,我们也可以定义一个类来描述,这个类就是Field 我们看一下JDK中关于Field的定义 一篇文章彻底搞懂Java的大Class到底是什么 是不是和Class类一样,Field类也是一个普通的类

同理,类中所有的方法,是不是也有公共的特性? 答案:是的

  • 所有的类的方法,都有方法名 比如Student类中的getAge()方法,它的方法名是 "getAge"
  • 所有的类的方法,都有返回值类型 比如Student类中的getAge()方法,它的返回值是 int类型
  • 所有的类的方法,都有参数。(无参数也是算是特殊的参数吧) 比如Student类中的hello(String message)方法,有一个参数,参数的类型是值是 String类型
  • 所有类的方法,都有修饰符号。 比如Student类中的getAge()方法,它修饰符号是 public

所以这些类的方法的公共的特性,我们也可以定义一个类来描述,这个类就是Method 我们看下JDK中的定义 一篇文章彻底搞懂Java的大Class到底是什么 同样是一个普通的类

由上面可以,那么Class类就是通过FieldMethod来描述类中的字段和方法 我们来看一下JDK中Class类中,关于Field和Method的成员 一篇文章彻底搞懂Java的大Class到底是什么 这些数组就是保存类中的字段或者方法的。

扯远了,回到开头,Class类能干什么? 既然通过上面我们知道了,Class类中保存的是所有类的公共特性,那么是不是我们通过Class知道某个类中有多少方法,有多少字段,每个字段叫什么名字,每个字段的类型是什么,每个方法的方法名是什么,某个方法有几个参数,等等

答案是肯定的 那如何通过Class知道你说的这些信息呢? 当然是写代码啊,比如我们在程序运行的时候,点击某个按钮,打印出某个类的信息,是可以做到的

Class如何使用?

既然上面我们知道了Class能干什么了?下面我们简单的了解一下,如何使用Class

如何使用Class?

Class就是一个普通的类啊,使用普通的类就是创建一个对象,才能使用啊 很简单啊,我们创建一个Class的对象就行了啊,就可以调用对象的各种方法了啊 使用就是这么简单

如何获取一个Class的对象?

我们先看一下JDK中 Class类的构造函数 一篇文章彻底搞懂Java的大Class到底是什么 就这一个构造函数,还是私有的,所以,我们不能直接new一个对象了

如何获取一个Class的对象? 答案:有以下3种方法,直接上代码

   public static void main(String[] args){
        //第一种
        Class c1 = String.class;

        //第二种
        String s = "hello,world";
        Class c2 = s.getClass();

        //第三种,以上面的Book类为例,其实就是动态加载类,注意捕获异常,因为类有可能不存在 
        try {
            Class c3 = Class.forName("com.test.Book");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

有了 Class的对象我们怎么用

我们直接通过一个demo来演示更加的直接,如下


package com.example.demo;

public class Student {
    private String name;
    private int age;

    public static void main(String[] args){
        //一般我们把Class的对象叫字节码
        Class c = Student.class;

        // 外部普通类
        System.out.println("Student类名是:" + c.getName());
        System.out.println("Student类的简单类名是:" + c.getSimpleName());
        System.out.println("Student类有" + c.getDeclaredFields().length + "个字段");

        /**
         * ....
         * 我们可以通过 c (也就是Student这个类的对象,或者你也可以叫做Student类的字节码)
         * 拿到Student类中所有的方法名,方法数,字段名,字段数量,甚至你还可以通过Method来调用方法
         * 只要查查API,熟悉了API,就能做到
         * 暂时我们只打印简单
         */
    }
}

总结一下: 综上所述,我们知道了

  • Class就是一个普通的类,就是用来描述一个类的信息的(比如类有几个字段,几个方法,名字叫什么等等 )
  • 可以通过 3 种方法来获取Class的对象,也就是某个类的字节码
  • 有个某个类的字节码以后,我们就知道知道这个类的许多信息了
  • Class一般是在运行时使用,你只要告诉我类名,我就可以知道这个类中有多少方法,有多少字段,怎么调用等等
  • Filed,Method(还有其它的,我们只说这2个),分别是描述类的字段和类的方法的

关于 Class 的知识就讲到这里,主要是明白 Class 到底是个什么东西,剩下的就自己查一下API,写个demo测试一下就行了。

希望这篇文章能给读者带来帮忙

收藏
评论区

相关推荐

JVM--虚拟机方法调用
概述 Java能做到一次编译,随处运行,最要是归功于java虚拟机 和class文件,我们知道,计算机是0和1 的世界,并且只认0和1,所以不管是什么语言什么编译类型,最终给计算机的都是0和1,java也不例外,但是我们的java编译成了class文件,class怎么就转换成0和1了呢,或者说机器码呢?其实这一步是虚拟机帮我们干的。当然,虚拟机是建立在不同
JAVA基础篇:Object对象
1 Object的内存结构和指针压缩了解一下 java //hotspot的oop.hpp文件中class oopDesc class
一篇文章彻底搞懂Java的大Class到底是什么
作者在之前工作中,面试过很多求职者,发现有很多面试者对Java的 Class 搞不明白,理解的不到位,一知半解,一到用的时候,就不太会用。 因为自己本身以前刚学安卓的时候,甚至做安卓2,3年后,也是对 java的 Class不是太清楚,所以想写一篇关于Java Class 的文章,没有那么多专业名词,希望用通俗的语言能把Java的 Class 这个概念讲明
Groovy初探
开始之前 了解本教程的主要内容,以及如何从中获得最大收获。 关于本教程 如果现在有人要开始完全重写 Java,那么 Groovy 就像是 Java 2.0。Groovy 并没有取代 Java,而是作为 Java 的补充,它提供了更简单、更灵活的语法,可以在运行时动态地进行类型检查。您可以使用 Groovy 随意编写 Java 应用程序,连接 Java
Java编程 经验技巧汇总
1.JSONArray数组如何循环遍历 java package xxx; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class Test { public static void main(String args) { /author:命运的信徒 da
Android动态加载基础 ClassLoader工作机制
类加载器ClassLoader 早期使用过Eclipse等Java编写的软件的同学可能比较熟悉,Eclipse可以加载许多第三方的插件(或者叫扩展),这就是动态加载。这些插件大多是一些Jar包,而使用插件其实就是动态加载Jar包里的Class进行工作。这其实非常好理解,Java代码都是写在Class里面的,程序运行在虚拟机上
《java 核心技术》卷1 学习 概述 第一章Java程序设计概述
从浅面了解Java 1.Java 在语言得地位 现在有所下降 但仍是老大哥 所以值得学习 2.Java特性 1.简单性:从一方面来说 Java可以支持在小型机器上运行 必定不是很复杂得,所以上手不难 2.面向对象:Java有相比于其他的语言 更简单得接口
java实现九九乘法表的输出
这是小学二年级令人难忘的坷如今以java程序的行式展示,真不戳! public class score{ public static void main(String args) { int i,j; for(i1;i<9;i) { for (j 1; j < 9; j
security 概念
security 创建核心配置文件java@EnableWebSecuritypublic class SeurityConfig extends WebSecurityConfigurerAdapter{} 改写方法java / 认证 在内存中创建了一个用户
使用Java 语言编写一个贪吃蛇游戏
使用 Java 语言编写一个贪吃蛇游戏,代码如下:GreedSnake .java package jzjsfx;public class GreedSnake public static void main(String[] args) SnakeModel model new SnakeModel(20, 30); SnakeControl c
一篇文章弄懂 Java 反射的使用
说到Java反射,必须先把 Java 的字节码搞明白了,也就是 Class , 大 Class在之前的文章中,我们知道了Java的大Class就是类的字节码,就是一个普通的类,里面保存的是类的信息,还不太明白Java的大Class的,可以先看一下之前的文章 先想一个问题 1. 给我们一个类,我们如何使用?这还不简单,通过这个类,创建一个类的对象,再通过这个
2021年度最全面JVM虚拟机,类加载过程与类加载器
前言类装载器子系统是JVM中非常重要的部分,是学习JVM绕不开的一关。一般来说,Java 类的虚拟机使用 Java 方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表
一篇文章通俗易懂的让你彻底理解 Java 注解
很多Java程序员,对Java的注解一知半解,更有甚者,有的人可能连注解是什么都不知道本文我们用最简单的 demo , 最通俗最短的语言,带你了解注解到底是什么?先来简单回顾一下基础,我们知道,Java 的源文件编辑后,生成 .class 文件,1. .Java源文件,这个是源文件时期2. 源文件经过编译生成 .class 字节码文件,这个也是编译时期3
2021年度最全面JVM虚拟机,类加载过程与类加载器
前言类装载器子系统是JVM中非常重要的部分,是学习JVM绕不开的一关。一般来说,Java 类的虚拟机使用 Java 方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表
大厂必备面试题———JVM内存结构
JVM 一,基本介绍解释:java虚拟机,准确的来说是java二进制字节码的运行环境。(jvm是一套规范),用来执行class文件,保证java语言跨平台。Java虚拟机可以看作是一台虚拟的计算机,和真是的计算机一样,有着自己的指令集以及各种运行时内存。jvm就是一个字节码翻译器,它将字节码文件翻译成各个系统对应的的机器码,确保字节码文件能在各个系统上正确的