Java中关于先有鸡还是先有蛋的问题—-Class&Object

 在Java中,我们常常会看到一个类型:Class。并且在类似Person.class,cache.getClass()等代码中见到它的身影。

众所周知,Class是用来描述一个类的类型,而Object是所有对象的最终父对象。那么就会引申出下边的两个结论:

1、如果从对象的角度来看,那么肯定是先有Object对象,其次才有其派生的对象Class。

2、Class表示的是类、对象,肯定是先有类这个概念,其次才有各个类型(抽象的、非抽象的),包括Object。

这就会出现一个问题,到底是先有Class(鸡)还是先有Object(蛋)/span>

Java中关于先有鸡还是先有蛋的问题----Class&Object

解了class,Object,Class的关系,我们接下来深入说说Class类。(这才是这篇博客的主要目的)

 一、背景知识

类对象在使用之前都会被JVM加载(其实是经过加载、连接、初始化三个步骤对类完成初始化)。类加载指的就是JVM将class文件读入内存,并为之创建一个Class对象。同时当一个类被加载后,再次使用时,就不会被重复加(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )载。这样新建的Class与加载的class就形成一一对应的关系。 通过该Class对象,就可以访问到对应的class。所以我们可以把Class理解为一个类的标识对象,它相当于是一个类的标签(铭牌)。拿到一个Class,我们就可以找到对应的类(class)。

二、获取Class对象的方法

在Java中我们可以使用三个方法拿到Class对象。其中两种是针对已经在家的类对象,去获得他对应的Class对象。剩余一种利用到了反射,根据提供的类名去寻找对应的class文件,进而找到Class对象。

 

 

三、 从Class中可以获取到的信息

系统可以通过Class对象,找到该对象对应的class.而Class对象包含了class的基本详细信息。这些信息可以分为以下四个方面: 1、获取到class所包含的构造器。 2、获取到class所包含的方法。 3、获取到class所包含的成员变量。 4、获取到class所包含的Annotation。 ps 很多小伙伴可能对Annotation不太熟悉,这里简单说下:Annotation翻译为注解,本身也是一个类,可以用来保存类的描述信息。 有兴趣的可以参考下面这篇文章:

http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html

四、在工作中Class类的使用用途

在这里我总结了一下曾经遇到的使用情况,将其分为;两方面,如果有遗漏,大家可以补充。

1、对对象类型的使用和校验

有些时候,我们需要对传入对象的类型进行校验,判断传入的对象是否为我们需要的类型。 

 

2、反射

<1>用字符串定义需要加载的类名,然后等到需要时候再加载。

  这样做有三个用途:

  (1)有时候并不知道此处需要加载的类型,需要在运行时才可能知道需要加载哪个class,譬如在运行的过程中,根据用户的手动设置,动态的选择接下来要加载的类。  

  (2)在编译时已经知道需要加载的类名,但是尚无需要加载的.class文件,需要在运行时,通过用户上传,或者后台到指定地址下载class文件。   插件化开发的实现就是使用这样一个原理。举两个例子:

      (α)用户在使用过滤时,需要自己来定义一套复杂的过滤机制,这时可能就无法通过界面简单的设置一下需要过滤的内容。可以由用户手动的上传自己的过滤算法的jar包,然后由后台动态的加载,使用该算法。

      (β)亦或者有时候在工作环境中,对于皮肤显示有一套默认的显示效果,同时也支持用户自己上传需要显示效果的jar包。后台拿到用户上传的jar包后,反射出需要用到的特效算法,形成动态的交互。  

  (3)缩短编译时间,加快启动软件的速度(包括client 和server)  

  在启动时,包含main方法的类被加载,同时它会加载(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )所自己需要的类。这些类再一次加载自己所需要的类。形成递推关系。但是对一个大应用程序来说,整个的启动(加载)过程耗费的时间,常常让用户无法忍受,甚至在还未加载完时就被强制关闭了。

Java中关于先有鸡还是先有蛋的问题----Class&Object Java中关于先有鸡还是先有蛋的问题----Class&Object

  针对这种情况,我们就可以在main方法类中只加载一些最基本的类。诸如登录、验证等。当登录验证没有问题之后,需要进入业务操作时,才会根据用户的选择,   加载用户需要的类。从而提高软件整体的运行效率和用户体验。

<2>对于工具的开发和使用

当我们开发工具或脚本时,除了使用系统公开的API外,有时还需要用到原有代码中被私有化的一些变量和方法。这时仅仅使用继承是不够的,还需要反射出对象,拿到其中的变量或调用其中的方法。 比如平常使用的UT框架,有时为了测试效率,就提供了很多可以直接调用待测试类私有方法的API。

 

转载于:https://www.cnblogs.com/jilodream/p/5024743.html

文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览114031 人正在系统学习中 相关资源:世新砸抽奖软件V2.3.10官方安装版-其它代码类资源-CSDN文库

来源:weixin_30596023

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2015年11月4日
下一篇 2015年11月5日

相关推荐