说到反射,首先要说一下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();
}
} }

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. RPM 安装oracle18c 修改字符集的方法

    1. 安装完preinstall 和 oracle 的rpm版本之后 到这个界面 rpm -ivh oracle-database-preinstall-18c-.el7.x86_64.rpm war ...

  2. [转帖]InfiniBand技术和协议架构分析

    InfiniBand技术和协议架构分析 2017年06月06日 20:54:16 Hardy晗狄 阅读数:15207 标签: 云计算存储Infiniband 更多 个人分类: 存储云计算   版权声明 ...

  3. VIM 命令收藏

    1.vim#在命令行中输入vim,进入vim编辑器2.i#按一下i键,下端显示 --INSERT--#插入命令,在vim中可能任意字符都有作用3.Esc#退出i(插入)命令进行其它命令使用4.:r f ...

  4. delphi(假三层之数据访问层)(第一天)

    本论文主要是通过三天来讲解三层的结构,今天是第一天,先讲解一下delphi下的Models层,我主要封装了两个查询得到数据集的函数,主要是通过在表示层上创建的数数据集控件传递进来,通过业务逻辑对语句的 ...

  5. UVAlive4080_Warfare And Logistics

    给一个无向图,求出两个值,所有点到所有其他点的最短距离和,任意删除一条边后的这个值. 数据规模是100点1000边. 白书例题,不多说了直接对于每个点求出最短路树,对于每条边,如果它不是最短路树上的边 ...

  6. BZOJ1853_幸运数字

    如果一个数字仅由6或者8构成,那么这个数字是幸运数字:如果一个数字是幸运数字的倍数,那么就是近似的幸运数. 给定区间,求有多少个近似幸运数字位于这个区间之内. 典型的容斥原理. 首先,弄出所有的幸运数 ...

  7. hdu6447 YJJ's Salesman

    这个题意和数据范围一看就是离散化之后树状数组优化DP.给的"从左下方走上去才能拿到收益"的性质其实可以当成"必须从横纵坐标严格比某个点小的地方转移过来".1A了 ...

  8. MySql--学习成长过程

    MySql--学习成长过程 模拟测试: QQ数据库管理 一.创建数据库并添加关系和测试数据 1 ##创建QQ数据库,完成简单的测试 2 3 #创建数据库 4 DROP DATABASE IF EXIS ...

  9. DAY6-Python学习笔记

    前记: 坚持写学习笔记今天是第六天了,今天事情有点多想起来还没写赶快补起来,学习Python已经快一个星期了,大部分的知识点已经跟着廖雪峰老师的教程了解了一下,由于自学能力不强还有很多知识点掌握不牢固 ...

  10. 编译安装keepalived,实现双主mysql高可用

    安装keepalived 1.官网下载源码包,解压 # wget http://www.keepalived.org/software/keepalived-1.1.20.tar.gz # tar x ...