你真的搞懂Class,class了么?

Posted 傻根根呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你真的搞懂Class,class了么?相关的知识,希望对你有一定的参考价值。

📢博客主页:🏀傻根根呀🏀
📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论!👏
📢本文由 【傻根根呀】 原创,首发于 CSDN🙉🙉🙉
📢由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!✨个人主页

📖精品专栏(不定时更新)【JavaSE】 【MySQL】【LeetCode】【Web】【操作系统】

目录

⭐一、Class是个啥?常见的ClassName.class又是个啥?

⭐二、探究小写ClassName.class 及 getClass

⭐三、总结


一、Class是个啥?常见的ClassName.class又是个啥?

注意哦,大写开头的Class人家是个正儿八经的类

Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.
Class has no public constructor. Instead Class objects are constructed automatically by the Java Virtual Machine as classes are loaded and by calls to the defineClass method in the class loader.

The following example uses a Class object to print the class name of an object:
       void printClassName(Object obj) 
           System.out.println("The class of " + obj +
                              " is " + obj.getClass().getName());
       


 
It is also possible to get the Class object for a named type (or for void) using a class literal. See Section 15.8.2 of The Java™ Language Specification. For example:
System.out.println("The name of class Foo is: "+Foo.class.getName());
自从:
JDK1.0开始就存在

 看不懂的哥们也没必要强行纠结,我们不纠结!我们解析一下要用它来干啥!

 

当我们用Class编译到上面的时候,我们发现,super,this,new都是我们的老朋友了,但是这里的class是个啥? 

不妨用IDEA的快捷键 Main.class.var 来帮我生成一下。

生成之后,好家伙,可见左边大写Class类也出来了,右边Main.class 也出来了,还有个<Main>的类似泛型标签的狗皮膏药一不小心编译器就帮你自动补全,贴上了。


⭐二、探究小写ClassName.class 及 getClass

决定对这个内容好好展开,是因为实在受不了使用synchronized 这个修饰符时,它用来修饰方法(普通方法、静态方法)时还好,都统称同步方法,但是时不时的给你来一个synchronized(ClassName.class),这个给我整不会了!必须拿下!

那么,通过类名_引用_小写class 即

public class ClassName 
    public static void main(String[] args) 
        Class<ClassName> classNameClass = ClassName.class;
    

那么它拿到class后返回的是什么,又是如何返回的?

查阅资料可知,这是典型的泛型用法,通过反射 返回指向 关于这个类的对象

注意我在此一口气提了关键字:反射、类的对象

反射 懂得都懂  不懂的兄弟可以移步我之前的Driver 数据库注册驱动,里面用到了反射机制。讲的比较详细。

此处类的对象 又跟我们平常实例化出来的对象有什么区别呢!?

这里的class 即 通过反射获得到的关于这个类的数据 所封装起来的数据对象。每个类只有一个。

独一无二。

你甚至可以通过 类的对象(这里是真的实例化出来的对象) 通过getClass获取 class

  ClassName className = new ClassName();
        Class<? extends ClassName> classNameClass1 = className.getClass();

public class ClassName 
    public static void main(String[] args) 
        Class<ClassName> classNameClass = ClassName.class;

        ClassName className = new ClassName();
        Class<? extends ClassName> classNameClass1 = className.getClass();

        System.out.println("classNameClass.equals(classNameClass1) = " + classNameClass.equals(classNameClass1));
    

 跑一跑,两种方法拿到的class是真的一模一样!~

我们还可以去Debug里边仔细查看

两个的hashCode是完全一致的!~


⭐三、总结

由大写的Class 我们发现,最终还是都要回到大写的Class 这个类上的,

举个不太恰当的例子,做饭用的调料都需要调料盒Class来装。

并且最好是给他 用<ClassName> 给这个调料种类(类名) 贴上标签

        Class<ClassName> classNameClass = ClassName.class;

        ClassName className = new ClassName();
        Class<? extends ClassName> classNameClass1 = className.getClass();

实在不想贴标签也行 

Class classNameClass2 = ClassName.class;

 油盐酱醋标签不加是可以的,但是必须放在Class的罐子里。

public class ClassName 
    public static void main(String[] args) 
        Class<ClassName> classNameClass = ClassName.class;//第一种

        ClassName className = new ClassName();
        Class<? extends ClassName> classNameClass1 = className.getClass();//第二种
        Class classNameClass2 = ClassName.class;//第三种
        System.out.println("classNameClass.equals(classNameClass1) = " + classNameClass.equals(classNameClass1));
        System.out.println("classNameClass1.equals(classNameClass2) = " + classNameClass1.equals(classNameClass2));
    

厨房里每种调料只有一个,我们的每个类获取的class也只有一个。

至于class(每个类对应的唯一的调料)如何取出来放到容器罐(Class)里?是用勺子还是汤匙(classObject.getClass 或 ClassName.class)

烹无定法,适口者珍!~

以上是关于你真的搞懂Class,class了么?的主要内容,如果未能解决你的问题,请参考以下文章

python单例模式你搞懂了么?我是终于懂了~

你真的了解java class name吗?

你真的了解Python中的类class?

一张图带你搞懂springBoot自动注入原理

java基础程序员你真的理解反射机制吗?

搞懂JVM类加载过程,其实很简单