JAVA编程之——反射Reflect

说到反射,首先要说一下Java中的类和对象。

在Java中万事万物皆对象(有两个 例外,一个是普通数据类型,另一个是静态的东西,静态的东西不是对象的,是属于类的)。

在Java中,类也是对象,类是java.lang.class类的实例对象,即所谓There is a class named Class。

以下代码说明了Java中Class类的实例对象的三种表达方式

package org.guyezhai.reflect;

public class ClassDemo1 {

    public static void main(String[] args) {
        // Foo的对象如何表示
        Foo foo1 = new Foo();
        // Foo这个类 也是一个实例对象,Class类的实例对象
        // 任何一个类都是Class类的实例对象,这个实例对象有三种表示方式

        // 第一种表示方式,任何一个类都有一个隐含的静态成员变量class
        Class c1 = Foo.class;

        // 第二种表达方式,已经知道该类的对象,通过getClass()方法
        Class c2 = foo1.getClass();

        // 官网中,c1、c2表示了Foo类的类类型(class type)
        // 万事万物皆对象,类也是对象是Class类的实例对象,称为该类的类类型

        // c1和c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象
        System.out.println(c1 == c2);//true

        // 第三种表达方式
        Class c3 = null;
        try {
            c3 = Class.forName("org.guyezhai.reflect.Foo");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println(c2 == c3);//true

        // 我们完全可以通过类的类类型,创建该类的对象实例:通过c1、c2、c3创建Foo的实例
        try {
            Foo foo = (Foo) c1.newInstance();// 需要有无参构造函数
            foo.print();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

class Foo {
    void print() {
        System.err.println("foo");
    }
}

java中的类加载分为静态加载类和动态加载类两种,先来一个静态加载类的例子:

package org.guyezhai.reflect;

public class Office {

    /**
     * @param args
     */
    public static void main(String[] args) {
        if ("Word".equals(args[0])) {
            // new对象是静态加载类,在编译时刻就需要加载所有的可能使用到的类
            // 通过动态加载类可以解决该问题
            Word w = new Word();
            w.start();
        }
        if ("Excel".equals(args[0])) {
            // Excel类不存在,编译不通过
            // Excel e = new Excel();
            // e.start();
        }
    }

}

这种加载方式是我们常用的,但是有一个问题,如果Word类或Excel类有一个不存在,就会编译不通过,导致整个程序无法运行。

在某些情况下这也许不是我们想要的,我们希望只要Word或Excel中任一个存在就可以使用,这就需要改为动态加载类方式,代码如下:

首先创建一个接口officeAble:

package org.guyezhai.reflect;

public interface OfficeAble {
    public void start();
}

然后让Word和Excel类实现OfficeAble接口:

package org.guyezhai.reflect;

public class Word implements OfficeAble {

    public void start() {
        System.out.println("word...start()");
    }

}
package org.guyezhai.reflect;

public class Excel implements OfficeAble {

    public void start() {
        System.out.println("excel...start()");
    }

}

这样就可以动态加载Word或Excel了:

package org.guyezhai.reflect;

public class officeBetter {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            // 动态加载类,在运行时刻加载
            Class c = Class.forName(args[0]);
            // 通过类类型,创建该类的对象
            OfficeAble oa = (OfficeAble) c.newInstance();
            oa.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
时间: 2024-08-07 08:16:30

JAVA编程之——反射Reflect的相关文章

Java编程之反射中的注解详解

"注解"这个词,可谓是在Java编程中出镜率比较高,而且也是一个老生常谈的话题.我们之前在聊Spring相关的东西时,注解是无处不在,之前我们简单的聊过一些"注解"的相关内容,比如在Spring中是如何进行"注解"组合的.因为注解在Java编程中还是比较重要的,所以我们今天的博客就把注解的东西给系统的介绍一下,当然我们会依托于具体的实例. "注解"说白了就是存储数据的一种方式,如果注解单拎出来功能也就一般,如果将"注

Java编程基础-反射

一.java反射 1.反射:动态获取类的信息,以及动态调用对象的方法的功能.可以理解为动态看透类的能力. 2.主要功能:在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法:生成动态代理. 通过Java反射机制,可以在程序中访问已经装载到JVM中的java对象的描述,实现访问.检测和修改描述java对象本身信息的功能.java反射机制的功能十分强大,java.lang.reflect包中提供了对该功能的支持.

简单原理来介绍java编程之反射

直接上代码,比较简单大家都应该能看懂: package com.blueZhang.reflect; /** * 创建USB接口 * 鼠标键盘等都属于USB设备 * */ public interface usb { //打开USB public void open(); //关闭USB public void close(); } /** * */ package com.blueZhang.reflect; /** * @author blueZhang * */ public class

java中【反射(Reflect)】的常见应用场景

简介: 总结于imooc课程:     http://www.imooc.com/learn/199   本文通过几个简单的例子,介绍Class类的使用,方法和成员变量的反射,以及通过反射了解集合泛型的本质等知识. 1.Class类的使用 /** * 使用java.lang.Class类动态加载一个类,编译时不对类是否存在以及对错进行检查,运行时检查 */ public class OfficeBetter { public static void main(String[] args) { a

黑马程序员--Java基础学习笔记【单例设计模式、网络编程、反射】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 设计模式分类: 创建模式:是对类的实例化过程的抽象化,又分为类创建模式和对象创建模式 类创建模式:工厂方法模式 对象-:简单工厂(静态工厂方法)模式.抽象工厂模式.单例模式.建造模式- 结构模式:描述如何将类或者对象结合在一起形成更大的结构 适配器模式.缺省模式.合成模式.装饰模式(包装模式).门面模式- 行为模式:对不同的对象之间划分责任和算法的抽象化 不变模式.策略模式.迭代子模式.命令模

Java 编程的动态性,第 8 部分: 用代码生成取代反射--转载

既然您已经看到了如何使用 Javassist 和 BCEL 框架来进行 classworking (请参阅 本系列以前的一组文章), 我将展示一个实际的 classworking 应用程序.这个应用程序用运行时生成的.并立即装载到 JVM 的类来取代反射.在综合讨论的过程中,我将引用本系列的前两篇文章,以及对 Javassist 和 BCEL 的讨论,这样本文就成为了对这个很长的系列文章的一个很好的总结. 反射的性能 在 第 2 部分, 我展示了无论是对于字段访问还是方法调用,反射都比直接代码慢

Java编程 的动态性,第 2部分: 引入反射--转载

在“ Java编程的动态性,第1部分,”我为您介绍了Java编程类和类装入.该篇文章介绍了一些Java二进制类格式的相关信息.这个月我将阐述使用Java反射API来在运行时接入和使用一些相同信息的基础.为了使已经熟知反射基础的开发人员关注本文,我将在文章中包括反射性能如何与直接接入相比较. 使用反射不同于常规的Java编程,其中它与 元数据--描述其它数据的数据协作.Java语言反射接入的特殊类型的原数据是JVM中类和对象的描述.反射使您能够运行时接入广泛的类信息.它甚至使您能够读写字段,调用运

Java编程思想(十八) —— 再谈反射

在Java编程思想(十五) -- 类型信息之反射和Java编程思想(十六) -- 联系JVM再谈Class,书上只用了3页就讲完了,还有讲了那么多Class的东西,接下来要从反射中怎么用,自己结合API和其他资料再写多一些. 示例:Test.java public class Test { public Test() {     }      public Test(int i) {         System.out.println(i);     } private void pri()

java 反射(reflect)总结,附对象打印工具类

java反射机制认知 java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类的信息以及动态调用对象的方法的功能称为java语言的反射机制Reflection. 这就说明:Java程序可以加载一个编译期间完全未知的class,获悉其完整构造,并生成其对象实体.或对其fields设值.或唤起其methods.虽然java并不是动态语言. 如何达到上述目的,是本文探讨的内容.本文将介绍Reflection A