Java 反射

参考:http://blog.csdn.net/zhuojiajin/article/details/39255815

在Java的世界里,万事万物皆对象 **(除了静态成员和普通的数据类型(但有包装类)) **;那么我们平常所写的类其实也是对象,它们是java.lang.Class类的对象。

package Test;

public class ClassDemo1 {
    public static void main(String []args){
        //Foo类的实例对象
        Foo foo1 = new Foo();
         /*
        Foo这个类也是一个实例对象,理论上是Class类的实例对象,但我们
        接下来创建的Class类的实例对象实际上是Foo类的类类型,顾名思义,
        类类型就是类的类型,也就是描述一个类是什么,都有哪些东西,所
        以我们可以通过类类型知道一个类的属性和方法,并且可以调用一个
        类的属性和方法,这就是反射的基础。
        */
        /*
        我们可以通过Fool类创建Class类的对象,也就是Fool类的类类型,
        具体有以下三种方式。
        */
        //第一种表示方式,这说明任何一个类都有一个隐含的静态成员变量class,
        //这种方式是通过获取类的静态成员变量class得到的
        Class c1 = Foo.class;

        //第二种表示方式,通过该类的对象获得,比如通过Foo类的对象foo1来获得
        Class c2 = foo1.getClass();

        //第三种表达方式,forName里面的格式是forName("包名.类名")
        //这里需要加上异常处理,否则会报错
        try {
            Class c3 = Class.forName("Test.Foo");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            Foo foo = (Foo)c1.newInstance();//需要有无参数的构造方法
            foo.print();        
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
class Foo{
    void print()
    {
        System.out.println("foo!!!");
    }
}

我的 ** 个人理解 ** 是Class类是一个万能的类,他可以制造出许多不同的实例对象,而我们通过上述方法创建的出来的Class类的实例对象(也就是Foo类的类类型),就是Class类可以制造出的不同的实例对象的其中一个。通过Foo类可以创建一个Foo类的类类型(也就是Class类许多实例对象的其中之一),也可以通过其他类,比如animal类,创建一个animal类的类类型(也是Class类许多实例对象之一)。我们可以通过Foo类的类类型来创建Foo类的实例对象,通过c1(c2,c3)创建Foo类的实例对象,* Foo foo= (Foo)c1.newInstance();//需要有无参数的构造方法 *,这里 的c1是Fool类的类类型,创建出来的就是Foo类的实例对象,如果c1是animal类的类类型,创建出来的就是animal类的实例对象。A类的类类型创建出的就是A类的实例对象。

最后,官网上的描述是这样的:c1,c2,c3表示了Foo类的类类型(class type)。

*** 2017/2/18重新修改添加 ***
*** 我们平常所写的类其实也是对象,它们是java.lang.Class类的对象 ***,其实这种说法也不是很准确,Class类是所有类(注意是对象)的共有信息的抽象,比如该类实现的接口、对应的加载器、类名等等。一句话,类类型保存了每个类所对应的类型信息。每一个类都有一个Class对象,这个对象在类被加载后由JVM自动构造。也是由JVM管理的,Class类是没有公共的构造方法的。

Class对象对于类来说就像是,DNA对于每个人,里面有你的一切生物信息。java中可以通过Class来取得类的实例,也许将来的将来通过你的DNA也能得到你的另一个实例。科幻电影里是已经实现了。

这里需要注意的是虚拟机只会产生一份字节码, 用这份字节码可以产生多个实例对象。也就是说Class对象只会有一个。看如下代码:

public class Test {  
   static {  
       System.out.println("静态初始化");  
   }  
   {  
       System.out.println("非静态初始化");  
   }  
}  
public class client {  
    public static void main(String[] arg) throws ClassNotFoundException, InstantiationException, IllegalAccessException{  
               //方法1  
       Class c=Class.forName("com.zjj.ClassTest.Test");  
               //方法2  
        c=Test.class;  
               //方法3  
        Test t=new Test();  
        c=t.getClass();  
        Test t2=new Test();  
    }  
}  

输出结果:

静态初始化
非静态初始化
非静态初始化

静态初始化方法是在类加载的时候执行的,只执行一次,非静态初始化方法是在类被实例化的时候执行的,实例化一次执行一次。而输出结果只打印了一次“静态初始化”,说明只加载了一次,说明只有一个ClassLoader,说明只有一个Class对象,说明三次得到的Class对象都是同一个,有多个引用而已。

也就是说,在运行期间,如果我们要产生某个类的对象或者的得到某个类的Class对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。

** 至此,应该可以理解了Class也是一个类,只不过它是所有类的一个抽象,名字又和我们所知道的Class一样容易造成混淆。总的来说,每一个类都有对应的一个Class对象来保存这个类的信息,这个Class对象由JVM构造和管理。Class对象的存在是Java反射的基础。 **

** 反射机制是Java的一个重要的内容,为Java提供了运行时加载类的能力,也就是动态性。Class是信息提供者,Class Loader是加载工具,二者都是反射机制最基础的部分。那么所谓的反射就是解除耦合,方式就是通过Class取得未知类的信息,而后实例化。当然Class Loader的所做的工作是隐藏的,是Class对象去调用的。所以无需显式的自己调用。 **

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,622评论 18 399
  • 反射的概念 Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Refle...
    少冰三hun甜阅读 330评论 0 0
  • 一、概述 Java反射机制定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法...
    CoderZS阅读 1,634评论 0 26
  • 在一个开阔的空地上聚集着一大群人,男女老少皆有,个个翘首企盼。不多时,一辆中巴车缓缓驶来,车子还未停稳,车门...
    随缘wang阅读 935评论 2 2