Java网络编程精解之Java语言的反射机制一(1)

发表于:2007-06-11来源:作者:点击数: 标签:
第3章 ServerSocket用法详解 第10章 Java语言的反射机制 第13章 基于MVC和R MI 的分布 ServerSocket用法详解一 Java语言的反射机制一 基于MVC和RMI的分布式应用一 ServerSocket用法详解二 Java语言的反射机制二 基于MVC和RMI的分布式应用二 ServerSocket用法

第3章 ServerSocket用法详解 第10章 Java语言的反射机制 第13章 基于MVC和RMI的分布
ServerSocket用法详解一
Java语言的反射机制一
基于MVC和RMI的分布式应用一
ServerSocket用法详解二
Java语言的反射机制二
基于MVC和RMI的分布式应用二
ServerSocket用法详解三
   

在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息,以及动态调用对象的方法的功能来自于Java语言的反射(Reflection)机制。Java反射机制主要提供了以下功能:

◆在运行时判断任意一个对象所属的类;

◆在运行时构造任意一个类的对象;

◆在运行时判断任意一个类所具有的成员变量和方法;

◆在运行时调用任意一个对象的方法;

◆生成动态代理。

本章首先介绍了Java Reflection API的用法,然后介绍了一个远程方法调用的例子,在这个例子中客户端能够远程调用服务器端的一个对象的方法。服务器端采用了反射机制提供的动态调用方法的功能,而客户端则采用了反射机制提供的动态代理功能。

10.1  Java Reflection API简介

在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中。

◆Class类:代表一个类。

◆Field类:代表类的成员变量(成员变量也称为类的属性)。

◆Method类:代表类的方法。

◆Constructor类:代表类的构造方法。

◆Array类:提供了动态创建数组,以及访问数组元素的静态方法。

如例程10-1所示DumpMethods类演示了Reflection API的基本作用,它读取命令行参数指定的类名,然后打印这个类所具有的方法信息:

例程10-1  DumpMethods.java

import java.lang.reflect.*;

public class DumpMethods {

public static void main(String args[]) throws Exception{

//加载并初始化命令行参数指定的类

Class classType = Class.forName(args[0]);

//获得类的所有方法

Method methods[] = classType.getDeclaredMethods();

for(int i = 0; i < methods.length; i++)

System.out.println(methods[i].toString());

}

}

运行命令“java DumpMethods java.util.Stack”,就会显示java.util.Stack类所具有的方法,程序的打印结果如下:

public synchronized java.lang.Object java.util.Stack.pop()

public java.lang.Object java.util.Stack.push(java.lang.Object)

public boolean java.util.Stack.empty()

public synchronized java.lang.Object java.util.Stack.peek()

public synchronized int java.util.Stack.search(java.lang.Object)

如例程10-2所示ReflectTester类进一步演示了Reflection API的基本使用方法。ReflectTester类有一个copy(Object object)方法,这个方法能够创建一个和参数object同样类型的对象,然后把object对象中的所有属性复制到新建的对象中,并将它返回。

这个例子只能复制简单的JavaBean,假定JavaBean的每个属性都有public类型的getXXX()和setXXX()方法。

例程10-2  ReflectTester.java

import java.lang.reflect.*;

public class ReflectTester {

public Object copy(Object object) throws Exception{

//获得对象的类型

Class classType=object.getClass();

System.out.println("Class:"+classType.getName());

//通过默认构造方法创建一个新的对象

Object objectCopy=classType.getConstructor(new Class[]{}).

newInstance(new Object[]{});

//获得对象的所有属性

Field fields[]=classType.getDeclaredFields();

for(int i=0; i
Field field=fields[i];

String fieldName=field.getName();

String firstLetter=fieldName.substring(0,1).toUpperCase();

//获得和属性对应的getXXX()方法的名字

String getMethodName="get"+firstLetter+fieldName.substring(1);

//获得和属性对应的setXXX()方法的名字

String setMethodName="set"+firstLetter+fieldName.substring(1);

//获得和属性对应的getXXX()方法

Method getMethod=classType.getMethod(getMethodName,new Class[]{});

//获得和属性对应的setXXX()方法

Method setMethod=classType.getMethod(setMethodName,new Class[]{field.getType()});

//调用原对象的getXXX()方法

Object value=getMethod.invoke(object,new Object[]{});

System.out.println(fieldName+":"+value);

//调用复制对象的setXXX()方法

etMethod.invoke(objectCopy,new Object[]{value});

}

return objectCopy;

}

public static void main(String[] args) throws Exception{

Customer customer=new Customer("Tom",21);

customer.setId(new Long(1));

Customer customerCopy=(Customer)new ReflectTester().copy(customer);

System.out.println("Copy information:"+customerCopy.getName()+""+

customerCopy.getAge());

}

}

class Customer{    //Customer类是一个JavaBean

private Long id;

private String name;

private int age;



public Customer(){}

public Customer(String name,int age){

this.name=name;

this.age=age;

}



public Long getId(){return id;}

public void setId(Long id){this.id=id;}



public String getName(){return name;}

public void setName(String name){this.name=name;}



public int getAge(){return age;}

public void setAge(int age){this.age=age;}

}


共4页: 1 [2] [3] [4] 下一页

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
...