移动的云计算项目,是由4,5个人一起协作完成的,每个人写的代码的格式都不尽相同,用到的反射机制的实现也不一样,我最近的主要工作就是将所有人写的代码进行统一的规范。首先是代码格式的规范,我参考了AS组内部的Java代码规范以及自己平时的习惯总结了一套格式,基本上和eclipse本身的代码规范相差不大。此外,就是反射机制的规范,我统一使用了反射代理来实现,它接收三个参数,即类的名称,构造器的参数类型,以及参数的值。此外,还包括invoke方法,它接收三个参数,即方法的名称,参数类型和方法的参数值。下面就是这个反射代理的源代码,以后可以拿它作为参考。

/*
* Java(TM) Web Container
* File: Reflection.java
* Version: 1.0.0
* Date: 2010-10-25
* Copyright 2010 (Chinamobile && ISCAS). All Rights Reserved
*/

package com.chinamobile.jomae;

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

/**
* Reflection类实现了反射机制的代理,可以为指定的类名调用构造器初始化实例,以及调用指定
* 的方法
*
*
@version 1.0.0
*
@author he_hai(hehai09@otcaix.iscas.cn)
*
*/
public class Reflection {

/** 通过Class的forName()方法查找到的Class对象 */
private Class m_clazz;

/** java.lang.Object对象 */
private Object m_object;

/**
* 通过Class的forName()方法查找参数name对应的Class对象,如果找到,则根据构造器的参数类型
* 来实例化这个类的对象,否则直接返回
*
*
@param name 类的名称,例如com.chinamobile.jomae.Reflection
*
@param params 类的构造器的参数类型,如果为空或长度为0,则代表无参构造函数
*
@param values 类的构造器的参数值
*/
public Reflection(String name, Class[] params, Object[] values) {
// 查看这个类是否存在,如果不存在则直接返回
try {
m_clazz
= Class.forName(name);
}
catch (ClassNotFoundException e) {
return;
}
// 通过构造器实例化一个对象,保存在m_object
try {
if(params == null || params.length == 0) {
// 无参构造器
m_object = m_clazz.newInstance();
}
else {
// 带有参数的构造器
Constructor constructor = m_clazz.getConstructor(params);
m_object
= constructor.newInstance(values);
}
}
catch (Exception e) {
return;
}
}

/**
* 获得类对象的实例
*
*
@return 如果类对象已经实例化,则返回类对象,否则返回null
*/
public Object getRefObject() {
if (m_object != null) {
return m_object;
}
return null;
}

/**
* 在已经获得Class对象的情况下,获得指定名称和参数类型所对应的方法,并根据参数值来
* 调用这个方法。如果类存在而方法调用错误,则显示异常链,如果类不存在,则返回"\0"
*
*
@param name 方法名
*
@param params 方法的参数类型
*
@param values 方法的参数值
*
@return 方法调用返回的值,如果方法调用错误,抛出异常,如果Class对象不存在,则返回"\0"
*/
public Object invoke(String name ,Class[] params, Object[] values) {
try {
Method m
= m_clazz.getMethod(name, params);
return m.invoke(m_object, values);
}
catch (Exception e) {
// 如果类存在,但是方法调用错误,则显示异常链
if (m_clazz != null) {
e.printStackTrace();
}
}
return "\0";
}
}