Java 的大 Class 到底是什么?,吃透这份 Java 高级工程师面试 497 题解析
其实我们这里的 Info 类,就是 java 中的 Class,java 中的Class
其实就是个普通的类而已,和其它的类没什么不一样的。不信看看Class
定义
是不是就是一个普通的类,我们把继承关系去掉,是不是就是下面这样了
public class Class {
....
}
可不就是个普通的类嘛,只不过类名也叫Class
,和 java 中的关键字class
,只是首字母大写了而已,要我说当初就不应该起名叫Class
,应该叫Type
,就不会有那么多人误解了,就不会有人把Class
,class
这两个弄的晕头转向的傻傻分不清了。
总之一句话:Class 就是一个普通的类,这个类描述的是所有的类的公共特性
[](
)Class 类能干什么?
了解 Class 类能干什么之前,我们先来扩展一些其它的东西
既然上面我们知道了,所有的类都是有公共特性的,我们定义了一个叫Class
的类来描述这些公共特性
那么是不是所有的类的方法,所有的类的字段,是不是也有公共的特性?
答案是的
是不是有点迷糊? 不要怕,很简单,举个例子就知道了。
还是上面的Student
,Book
类,
所有的类的字段,都有名字。
比如Book
类中的price
字段,它的名字是不是"price"
所有的类的字段,都有类型。
比如Book
类中的price
字段,它的类型是?float
所有的类的字段,都有修饰符。
比如Book
类中的price
字段,它的修饰符是?private
所以这些类的字段公共的特性,我们也可以定义一个类来描述,这个类就是 Field
我们看一下 JDK 中关于 Field 的定义
是不是和Class
类一样,Field
类也是一个普通的类
同理,类中所有的方法,是不是也有公共的特性?
答案:是的
所有的类的方法,都有方法名
比如Student
类中的getAge()
方法,它的方法名是?"getAge"
所有的类的方法,都有返回值类型
比如Student
类中的getAge()
方法,它的返回值是?int
类型
所有的类的方法,都有参数。(无参数也是算是特殊的参数吧)
比如Student
类中的hello(String message)
方法,有一个参数,参数的类型是值是?String
类型
所有类的方法,都有修饰符号。
比如Student
类中的getAge()
方法,它修饰符号是?public
所以这些类的方法的公共的特性,我们也可以定义一个类来描述,这个类就是 Method
我们看下 JDK 中的定义
同样是一个普通的类
由上面可以,那么Class
类就是通过Field
和Method
来描述类中的字段和方法
我们来看一下 JDK 中Class
类中,关于 Field 和Method
的成员
这些数组就是保存类中的字段或者方法的。
扯远了,回到开头,Class 类能干什么?
既然通过上面我们知道了,Class 类中保存的是所有类的公共特性,那么是不是我们通过 Class 知道某个类中有多少方法,有多少字段,每个字段叫什么名字,每个字段的类型是什么,每个方法的方法名是什么,某个方法有几个参数,等等
答案是肯定的
那如何通过 Class 知道你说的这些信息呢?
当然是写代码啊,比如我们在程序运行的时候,点击某个按钮,打印出某个类的信息,是可以做到的
[](
)Class 如何使用?
既然上面我们知道了Class
能干什么了?下面我们简单的了解一下,如何使用Class
[](
)如何使用 Class?
Class 就是一个普通的类啊,使用普通的类就是创建一个对象,才能使用啊
很简单啊,我们创建一个 Class 的对象就行了啊,就可以调用对象的各种方法了啊
使用就是这么简单
[](
)如何获取一个 Class 的对象?
我们先看一下 JDK 中?Class
类的构造函数
就这一个构造函数,还是私有的,所以,我们不能直接new
一个对象了
如何获取一个 Class 的对象?
答案:有以下3
种方法,直接上代码
public static void main(String[] args){
//第一种
Class c1 = String.class;
//第二种
String s = "hell
o,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 类的字节码)
评论