`
haibin369
  • 浏览: 60277 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

第十四章-类型信息(2)

阅读更多

四、反射

      Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

      Class类与java.lang.reflect类库一起对反射的概念进行了支持,该类库包含了Field、Method、Constructor等类,每个类都实现了Member接口,该接口代表一个特定的成员(变量,方法或者构造器)。

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

class Test
{
	public int i;
	float j;
	
	public Testa(){}
	
	private Testa(String str){}
	
	public void fun(){}
}


public class ReflectTest
{
	//打印数组的方法
	public static void print(String name, Object[] array)
	{
		System.out.println("-----" + name + "------");
		for(Object obj : array)
		{
			System.out.println(obj);
		}
		System.out.println("---------------------------");
	}
	
	public static void main(String[] args)
	{
		Class<Test> c = Test.class;
		
		//获得所有声明的方法、变量和构造器
		Method[] declaredMethods = c.getDeclaredMethods();
		Field[] declaredFields = c.getDeclaredFields();
		Constructor[] declareConstructors = c.getDeclaredConstructors();
		
		//获得所有public的方法、变量和构造器
		Method[] publicMethods = c.getMethods();
		Field[] publicFields = c.getFields();
		Constructor[] publicConstructors = c.getConstructors();
		
		print("declared methods", declaredMethods);
		print("declared fields", declaredFields);
		print("declared constructors", declareConstructors);
		
		print("public methods", publicMethods);
		print("public fields", publicFields);
		print("public constructors", publicConstructors);
	}
}

 

输出

-----declared methods------
public static void Test.main(java.lang.String[])
---------------------------
-----declared fields------
---------------------------
-----declared constructors------
public Test()
---------------------------
-----public methods------
public static void Test.main(java.lang.String[])
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
---------------------------
-----public fields------
---------------------------
-----public constructors------
public Test()
---------------------------

 

五、动态代理

      代理是基本的设计模式之一,它是为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象。而Java的动态代理比代理的思想更向前迈进了一步,因为它可以动态地创建代理并动态地处理对所代理方法的调用。在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,它的工作是揭示调用的类型并确定相应的对策。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface AbstractSubject
{
	public void fun1();

	public void fun2();
}

class RealSubject implements AbstractSubject
{
	public void fun1()
	{
		System.out.println("fun1 invoked!");
	}

	public void fun2()
	{
		System.out.println("fun2 invoked!");
	}
}

/**
 * 代理的调用处理器
 */
class DynamicProxyHandler implements InvocationHandler
{
	private AbstractSubject proxied;

	//传入需要被代理的对象
	public DynamicProxyHandler(AbstractSubject proxied)
	{
		this.proxied = proxied;
	}

	//将方法的调用重定向到被代理的对象,同时增加额外操作
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable
	{
		System.out.print("From Proxy : ");
		return method.invoke(proxied, args);
	}
}

public class DynamicProxy
{
	public static void main(String[] args)
	{
		RealSubject subject = new RealSubject();
		DynamicProxyHandler proxyHandler = new DynamicProxyHandler(subject);

		//使用Proxy类的newProxyinstance方法生成代理对象
		//需要传入被代理对象的类加载器,实现的接口和对应的调用处理器
		AbstractSubject proxy = (AbstractSubject) Proxy.newProxyInstance(subject
				.getClass().getClassLoader(), subject.getClass().getInterfaces(),
				proxyHandler);
		
		//直接调用
		subject.fun1();
		subject.fun2();
		
		//代理调用
		proxy.fun1();
		proxy.fun2();
	}
}

 

输出

fun1 invoked!
fun2 invoked!
From Proxy : fun1 invoked!
From Proxy : fun2 invoked!

 

六、空对象

      在Java中,当使用内置的null表示缺少对象或者空对象时,在每次使用引用的时候都必须测试其是否为null,否则有可能抛出NullPointerException。这个时候引入“空对象”的思想将会很有用,“空对象”代表这样一些类和对象,它们并无意义,但是能代替null来表示空的对象,从而避免使用null。有了“空对象”,我们很很多情况下能把它们当作正常类来处理,只是使用这些“空对象”时会产生代表“空”的效果。

import java.util.ArrayList;

/*
 * 代表“空”的标志接口
 */
interface Null{}

/*
 * 代表一个具体的人
 */
class Person
{
	public final String name;
	public final String gender;
	
	public Person(String name, String gender)
	{
		this.name = name;
		this.gender = gender;
	}
	
	public String toString()
	{
		return "name:" + name + ", gender:" + gender;
	}
}

/*
 * 代表“没有人”的空对象
 * 使用单例模式,因为NullPerson一一致的,是通用的
 */
class NullPerson extends Person implements Null
{
	private static NullPerson nullPerson = new NullPerson();
	
	private NullPerson()
	{
		super("NONE", "NONE");
	}
	
	public static NullPerson getNullPerson()
	{
		return nullPerson;
	}
}

/*
 * 代表职位的类,包含职位名称和对应的人
 */
class Position
{
	private String position;
	private Person person;
	
	public Position(String position, Person person)
	{
		this.position = position;
		this.person = person;
	}
	
	public String toString()
	{
		return position + " --- " + person;
	}
}

public class NullTest
{
	public static void main(String[] args)
	{
		//代表某公司职位信息的List
		ArrayList<Position> companyPosition = new ArrayList<Position>();
		
		//往List中加入职位,当某个职位空缺时,该职位的人用“空对象”表示
		companyPosition.add(new Position("CEO", new Person("Ben", "male")));
		companyPosition.add(new Position("Software Engineer", new Person("George", "male")));
		companyPosition.add(new Position("Hardware Engineer", NullPerson.getNullPerson()));
		companyPosition.add(new Position("Dedigner", new Person("Tracy", "female")));
		
		//可以把所有元素当作正常的Person处理而不用担心因为null带来的异常或类型检测
		for(Position p : companyPosition)
		{
			System.out.println(p);
		}
	}
}

 输出:

CEO --- name:Ben, gender:male
Software Engineer --- name:George, gender:male
Hardware Engineer --- name:NONE, gender:NONE
Dedigner --- name:Tracy, gender:female
0
4
分享到:
评论

相关推荐

    第十四章 类型信息

    在"chapter14"这个压缩包文件中,可能包含了关于如何获取和利用类型信息的具体示例,涵盖上述各种情况。学习这部分内容,开发者可以提升对程序内部运作的理解,编写更健壮、更易于维护的代码,并且能够更有效地利用...

    计算机应用基础--第一章--项目1-认识和使用计算机.pptx

    计算机的应用领域 过程控制 计算机应用基础--第一章--项目1-认识和使用计算机全文共142页,当前为第14页。 2.计算机的应用领域 计算机辅助技术 (CAD、CAM、CAI、CIMS) 计算机应用基础--第一章--项目1-认识和使用...

    数据库6版讲稿第十四章---基于对象的数据库.ppt

    【数据库6版讲稿第十四章---基于对象的数据库】主要探讨了如何通过引入面向对象的概念和处理新的数据类型来扩展传统的关系模型,以更好地适应复杂数据的存储和管理需求。这一章的内容主要包括嵌套关系、复杂数据类型...

    电子技术原理基础--第十四章--时序逻辑电路.ppt

    《电子技术原理基础--第十四章--时序逻辑电路》主要介绍了时序逻辑电路的基本概念、分类、描述方法以及分析和设计的过程。时序逻辑电路是一种具有记忆功能的数字电路,它的输出不仅取决于当前的输入,还依赖于电路的...

    PL/SQL经典介绍

    第一章 PL-SQL一览 第二章 PL-SQL基础 第三章 PL-SQL数据类型 第四章 PL-SQL的控制结构 第五章 PL-SQL集合与记录(1) ...第十一章 PL-SQL对象类型 第十二章 本地动态SQL 第十三章 PL-SQL应用程序性能调优

    Python基础案例教程-第2章-基本数据类型.ppt

    这些数据类型包括数字、字符串和布尔型,它们分别用于处理不同的信息。本章深入探讨了Python的这些基本数据类型及其操作。 1. **数字类型** - **整数(Integer)**:整数是不包含小数部分的数值,如20、89、-30等...

    推选文档第四章-Visual-Basic-程序设计基础Programme-Design-PPT.ppt

    第四章的焦点是Visual Basic程序设计基础,涵盖了各种基本数据类型的理解和应用。在VB编程中,数据类型是定义变量可以存储何种类型数据的关键概念。 首先,字符串(String)是编程中常见的一种数据类型,用于存储一...

    visual c++6.0mfc类库参考手册第14章-第22章.rar

    《Visual C++ 6.0 MFC类库参考手册第14章至第22章》是一份关于Microsoft Foundation Classes (MFC) 的详细指南,它涵盖了MFC库的广泛内容,从高级控件到数据库编程,再到网络编程。MFC是微软为简化Windows应用程序...

    Python基础案例教程-第2章-基本数据类型.pptx

    例如,`14 + 5`的结果是19,`14 - 5`的结果是9,`14 * 5`是70,`14 / 5`约等于2.8,`14 % 5`是4,`14 // 5`是2,而`2 ** 3`则是8。在进行运算时,需要注意运算符的优先级,通常遵循先乘除后加减的原则。 在实际应用...

    第四十章-文件系统实现1

    第四十章-文件系统实现的预备知识主要涉及文件系统的基础概念和如何使用工具`vsfs.py`来观察文件系统状态的变化。这个工具用于模拟文件系统的操作,如创建文件、目录、读写文件、链接和删除等,以理解这些操作如何...

    电脑维修技术大全(图文并茂)第13章-第14章.pdf

    【电脑维修技术大全(图文并茂)第13章-第14章.pdf】是一部深入浅出的电脑维修教程,涵盖了计算机硬件维护和软件故障排查的丰富内容。本概述将聚焦于第13章和第14章的核心知识点,帮助读者理解和掌握关键的电脑维修...

    推选文档第十三章-UNIX系统程序设计-上海交通大学panPPT.ppt

    【推选文档】第十三章-UNIX系统程序设计主要涵盖了UNIX操作系统中系统程序设计的核心概念,特别是关于系统调用的返回值处理以及高级进程间通信(IPC)中的消息通信机制。以下是这些知识点的详细说明: 1. **系统...

    Java 语言程序设计 基础版 第十版 第一章--第五章 课后编程练习题答案

    Java语言程序设计基础版第十版的第一章至第五章课后编程练习题答案涵盖了Java编程的基础概念和关键技能。这些章节的题目旨在帮助学习者深入理解Java语法、数据类型、控制结构、类与对象以及异常处理等核心概念。下面...

    第2章--数据类型、常量和变量练习题答案-华中社《C语言程序设计上机指导与练习》.doc

    1-2 英语 高数 C 语言 英语 C 语言 3-4 上机 英语 高数 美术 高数 5-6 体育 美术 音乐 自习 自习 ``` 通过这些知识点,我们可以更好地理解 C 语言程序设计中的数据类型、常量和变量,并掌握如何应用它们来编写程序。

    Java编程思想第十四章类型信息之反射与代理.pptx

    Java编程思想第十四章类型信息之反射与代理.pptx

    第3章 PL-SQL数据类型

    - **定义与用途**:`BINARY_INTEGER` 是一种存储有符号整数的数据类型,取值范围为 -2^31 至 2^31。这种类型的数据比 `NUMBER` 类型占用的空间更小,但在某些操作上可能不如后者快。 - **子类型**: - **NATURAL**...

    JAVA习题库#第四章-方法.doc

    "JAVA习题库#第四章-方法" 本章节主要讲解了Java语言的方法相关知识点,包括方法的调用、方法的返回值、递归方法、方法重载、基本数据类型类等。 一、方法的调用 在Java语言中,方法可以通过方法名和参数来调用,...

    03307 21世纪高级营销主管培训--第十四章-设计和管理服务(PPT 13).ppt

    在21世纪的高级营销主管培训中,第十四章的主题聚焦于设计和管理服务。这一章节探讨了服务的本质,服务的分类,以及如何通过差异化和质量提升来优化服务。服务的定义强调其不可分离性、易消失性、无形性和可变性这四...

    数据库程序设计(共22章-PPT格式),内容很不错

    第1章 SQL Server 概述 ...第14章 创建和维护索引 第15章 实现视图 第16章 实现存储过程 第17章 实现用户定义函数 第18章 实现触发器 第19章 多服务器编程 第20章 优化查询性能 第21章 分析查询 第22章 管理事务和锁

    Python语言程序设计教程 北理工Python课程W03V03-字符串类型 共14页.pdf

    【大纲】0-1-课程内容和安排介绍1-1-计算机的概念1...函数与递归-1-函数定义第6章-函数与递归-2-函数的调用和返回值第6章-函数与递归-3-改变参数值的函数第6章-函数与递归-4-程序结构和递归第6章-函数与递归-5-函数实例

Global site tag (gtag.js) - Google Analytics