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();
- }
- }
- }
JAVA编程之——反射Reflect的更多相关文章
- Java编程之反射中的注解详解
"注解"这个词,可谓是在Java编程中出镜率比较高,而且也是一个老生常谈的话题.我们之前在聊Spring相关的东西时,注解是无处不在,之前我们简单的聊过一些"注解&quo ...
- 进阶Java编程(13)反射与Annotation
1,反射取得Annotation信息 从JDK1.5之后Java提供了Annotation技术支持,这种技术为项目的编写带来了新的模型,而后经过了十年的发展,Annotation的技术得到了非常广泛的 ...
- 进阶Java编程(10)反射与简单Java类
1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...
- Java框架基础——反射(reflect)
一.Class类的使用 1)在面向对象(oop)的世界里,万事万物皆对象. 在Java中,包括基本的数据类型,都是对象. Class c = int.class;//int 的类类型 那就是说: 类是 ...
- Java编程基础-反射
一.java反射 1.反射:动态获取类的信息,以及动态调用对象的方法的功能.可以理解为动态看透类的能力. 2.主要功能:在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意 ...
- Java中的反射--Reflect
在张孝祥老师的Java讲解中,学习到了Java反射的一部分知识,觉得有必要好好学习一下哈. 一.反射的理解 经典总结:反射就是把Java类中的各种成分映射成为相应的Java类 例如:一个Java类中用 ...
- 进阶Java编程(9)反射与类操作
1,反射获取类结构信息 在反射机制的处理过程之中不仅仅只是一个实例化对象的处理操作,更多的情况下还有类的组成结构操作,任何一个类的基本组成结构:父类(父接口).包.属性.方法(构造方法与普通方法). ...
- java 编程基础 反射方式获取泛型的类型Fileld.getGenericType() 或Method.getGenericParameterTypes(); (ParameterizedType) ;getActualTypeArguments()
引言 自从JDK5以后,Java Class类增加了泛型功能,从而允许使用泛型来限制Class类,例如,String.class的类型实际上是 Class 如果 Class 对应的类暂时未知,则使 C ...
- 黑马程序员:Java编程_反射技术
=========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性 ...
随机推荐
- 团队作业7——第二次项目冲刺(Beta版本12.07——12.08)
1.当天站立式会议照片 本次会议在5号公寓3楼召开,本次会议内容:①:熟悉每个人想做的模块.②:根据项目要求还没做的完成. 2.每个人的工作 经过会议讨论后确定了每个人的分工 组员 任务 陈福鹏 实现 ...
- 浅谈iOS内存管理机制
iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有 ...
- VS团队资源管理器(VS自带git)使用说明_使用VS自带git推送到远程存储库
使用git存储库是相当好的习惯,每次码完代码就推送到远程存储库,万一不小心把本地代码搞废了,或者硬盘坏了,或者中了勒索病毒,本地代码丢失了还能从服务器上下载.我曾经就中了一次勒索病毒,本地电脑上的所有 ...
- 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 ...
- 安装centos6及安装redhat6后的配置
一.安装centos6 在引导到镜像后,选择: 我选择第二个,使用基本的显卡驱动安装系统 #第一个也是可以选的(安装或升级现有的系统) 之后,与 RHEL5 同样,使用光盘引导安装,系统会提示我们是否 ...
- area point sql
UPDATE aa_info_area t,(SELECT areaId, areacenter,CONCAT('POINT(' ,substring_index(areacenter,',', 1) ...
- aes python加密
# *_*coding:utf-8 *_* #AES-demo import base64 from Crypto.Cipher import AES ''' 采用AES对称加密算法 ''' # st ...
- 使用 MQTTnet 快速实现 MQTT 通信
1 什么是 MQTT ? MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是 IBM 开发的一个即时通讯协议,有可能成为物联网的重要组成部分.MQT ...
- bzoj2095-Bridge
题意 一个 \(n\) 个点 \(m\) 条边的图,每条边双向都有权值(可能不一样).求从 1 开始,经过所有点,经过所有边一次且仅一次(即一定要经过这条边的某个方向)回到 1 的路径上权值最大的最小 ...
- BZOJ3173 TJOI2013最长上升子序列(splay)
容易发现如果求出最后的序列,只要算一下LIS就好了.序列用平衡树随便搞一下,这里种一棵splay. #include<iostream> #include<cstdio> #i ...