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

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

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

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

  1. package org.guyezhai.reflect;
  2.  
  3. public class ClassDemo1 {
  4.  
  5. public static void main(String[] args) {
  6. // Foo的对象如何表示
  7. Foo foo1 = new Foo();
  8. // Foo这个类 也是一个实例对象,Class类的实例对象
  9. // 任何一个类都是Class类的实例对象,这个实例对象有三种表示方式
  10.  
  11. // 第一种表示方式,任何一个类都有一个隐含的静态成员变量class
  12. Class c1 = Foo.class;
  13.  
  14. // 第二种表达方式,已经知道该类的对象,通过getClass()方法
  15. Class c2 = foo1.getClass();
  16.  
  17. // 官网中,c1、c2表示了Foo类的类类型(class type)
  18. // 万事万物皆对象,类也是对象是Class类的实例对象,称为该类的类类型
  19.  
  20. // c1和c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象
  21. System.out.println(c1 == c2);//true
  22.  
  23. // 第三种表达方式
  24. Class c3 = null;
  25. try {
  26. c3 = Class.forName("org.guyezhai.reflect.Foo");
  27. } catch (ClassNotFoundException e) {
  28. e.printStackTrace();
  29. }
  30. System.out.println(c2 == c3);//true
  31.  
  32. // 我们完全可以通过类的类类型,创建该类的对象实例:通过c1、c2、c3创建Foo的实例
  33. try {
  34. Foo foo = (Foo) c1.newInstance();// 需要有无参构造函数
  35. foo.print();
  36. } catch (InstantiationException e) {
  37. e.printStackTrace();
  38. } catch (IllegalAccessException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }
  43.  
  44. class Foo {
  45. void print() {
  46. System.err.println("foo");
  47. }
  48. }

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

  1. package org.guyezhai.reflect;
  2.  
  3. public class Office {
  4.  
  5. /**
  6. * @param args
  7. */
  8. public static void main(String[] args) {
  9. if ("Word".equals(args[0])) {
  10. // new对象是静态加载类,在编译时刻就需要加载所有的可能使用到的类
  11. // 通过动态加载类可以解决该问题
  12. Word w = new Word();
  13. w.start();
  14. }
  15. if ("Excel".equals(args[0])) {
  16. // Excel类不存在,编译不通过
  17. // Excel e = new Excel();
  18. // e.start();
  19. }
  20. }
  21.  
  22. }

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

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

首先创建一个接口officeAble:

  1. package org.guyezhai.reflect;
  2.  
  3. public interface OfficeAble {
  4. public void start();
  5. }

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

  1. package org.guyezhai.reflect;
  2.  
  3. public class Word implements OfficeAble {
  4.  
  5. public void start() {
  6. System.out.println("word...start()");
  7. }
  8.  
  9. }
  1. package org.guyezhai.reflect;
  2.  
  3. public class Excel implements OfficeAble {
  4.  
  5. public void start() {
  6. System.out.println("excel...start()");
  7. }
  8.  
  9. }

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

  1. package org.guyezhai.reflect;
  2.  
  3. public class officeBetter {
  4.  
  5. /**
  6. * @param args
  7. */
  8. public static void main(String[] args) {
  9. try {
  10. // 动态加载类,在运行时刻加载
  11. Class c = Class.forName(args[0]);
  12. // 通过类类型,创建该类的对象
  13. OfficeAble oa = (OfficeAble) c.newInstance();
  14. oa.start();
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. }
  19.  
  20. }

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

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

    "注解"这个词,可谓是在Java编程中出镜率比较高,而且也是一个老生常谈的话题.我们之前在聊Spring相关的东西时,注解是无处不在,之前我们简单的聊过一些"注解&quo ...

  2. 进阶Java编程(13)反射与Annotation

    1,反射取得Annotation信息 从JDK1.5之后Java提供了Annotation技术支持,这种技术为项目的编写带来了新的模型,而后经过了十年的发展,Annotation的技术得到了非常广泛的 ...

  3. 进阶Java编程(10)反射与简单Java类

    1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...

  4. Java框架基础——反射(reflect)

    一.Class类的使用 1)在面向对象(oop)的世界里,万事万物皆对象. 在Java中,包括基本的数据类型,都是对象. Class c = int.class;//int 的类类型 那就是说: 类是 ...

  5. Java编程基础-反射

    一.java反射 1.反射:动态获取类的信息,以及动态调用对象的方法的功能.可以理解为动态看透类的能力. 2.主要功能:在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意 ...

  6. Java中的反射--Reflect

    在张孝祥老师的Java讲解中,学习到了Java反射的一部分知识,觉得有必要好好学习一下哈. 一.反射的理解 经典总结:反射就是把Java类中的各种成分映射成为相应的Java类 例如:一个Java类中用 ...

  7. 进阶Java编程(9)反射与类操作

    1,反射获取类结构信息 在反射机制的处理过程之中不仅仅只是一个实例化对象的处理操作,更多的情况下还有类的组成结构操作,任何一个类的基本组成结构:父类(父接口).包.属性.方法(构造方法与普通方法). ...

  8. java 编程基础 反射方式获取泛型的类型Fileld.getGenericType() 或Method.getGenericParameterTypes(); (ParameterizedType) ;getActualTypeArguments()

    引言 自从JDK5以后,Java Class类增加了泛型功能,从而允许使用泛型来限制Class类,例如,String.class的类型实际上是 Class 如果 Class 对应的类暂时未知,则使 C ...

  9. 黑马程序员:Java编程_反射技术

    =========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性 ...

随机推荐

  1. 团队作业7——第二次项目冲刺(Beta版本12.07——12.08)

    1.当天站立式会议照片 本次会议在5号公寓3楼召开,本次会议内容:①:熟悉每个人想做的模块.②:根据项目要求还没做的完成. 2.每个人的工作 经过会议讨论后确定了每个人的分工 组员 任务 陈福鹏 实现 ...

  2. 浅谈iOS内存管理机制

    iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有 ...

  3. VS团队资源管理器(VS自带git)使用说明_使用VS自带git推送到远程存储库

    使用git存储库是相当好的习惯,每次码完代码就推送到远程存储库,万一不小心把本地代码搞废了,或者硬盘坏了,或者中了勒索病毒,本地代码丢失了还能从服务器上下载.我曾经就中了一次勒索病毒,本地电脑上的所有 ...

  4. Internet History, Technology and Security (Week 9)

    Week 9 Security: Web Security We are now on the second to last week of the class and finishing up ou ...

  5. 安装centos6及安装redhat6后的配置

    一.安装centos6 在引导到镜像后,选择: 我选择第二个,使用基本的显卡驱动安装系统 #第一个也是可以选的(安装或升级现有的系统) 之后,与 RHEL5 同样,使用光盘引导安装,系统会提示我们是否 ...

  6. area point sql

    UPDATE aa_info_area t,(SELECT areaId, areacenter,CONCAT('POINT(' ,substring_index(areacenter,',', 1) ...

  7. aes python加密

    # *_*coding:utf-8 *_* #AES-demo import base64 from Crypto.Cipher import AES ''' 采用AES对称加密算法 ''' # st ...

  8. 使用 MQTTnet 快速实现 MQTT 通信

    1 什么是 MQTT ? MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是 IBM 开发的一个即时通讯协议,有可能成为物联网的重要组成部分.MQT ...

  9. bzoj2095-Bridge

    题意 一个 \(n\) 个点 \(m\) 条边的图,每条边双向都有权值(可能不一样).求从 1 开始,经过所有点,经过所有边一次且仅一次(即一定要经过这条边的某个方向)回到 1 的路径上权值最大的最小 ...

  10. BZOJ3173 TJOI2013最长上升子序列(splay)

    容易发现如果求出最后的序列,只要算一下LIS就好了.序列用平衡树随便搞一下,这里种一棵splay. #include<iostream> #include<cstdio> #i ...