日期:2014-05-20  浏览次数:20797 次

java反射机制,求帮助!
我有一个功能,页面比较复杂,有一个地方据说用java反射比较好,但是我没用过,所以请大家给我讲讲java反射是怎么一回事,另求java反射经典代码,求学习

------解决方案--------------------
说起来他复杂了,lz可以看看这个http://apps.hi.baidu.com/share/detail/24992875,很不错的
------解决方案--------------------
这个自认为很全了,不知意下如何?
Java code
import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class ReflectFactory
{
    private static final String FILENAME = "reflect.ini";
    private Properties prop;
    private Map<String, String> objTool = new HashMap<String, String>();

    /**
     * 初始化 读取配置文件
     */
    public void init()
    {
        prop = new Properties();
        try
        {
            prop.load(new FileInputStream(FILENAME));
            Enumeration<?> keys = prop.keys();
            while (keys.hasMoreElements())
            {
                String key = (String) keys.nextElement();
                String value = prop.getProperty(key);
                objTool.put(key, value);
            }
        }catch (Exception e)
        {
            System.out.println("读配置文件异常");
        }
    }

    /**
     * 根据类名(完整包名)创建实例
     * @param className
     * @return 类的实例
     */
    private Object createObject(String className)
    {
        try
        {
            System.out.println(className);
            Class<?> clazz = Class.forName(className);
            return clazz.newInstance();
        }catch (Exception e)
        {
            System.out.println("创建类的实例异常");
        }
        return null;
    }

    /**
     * 根据 类名、方法名 调用相应的方法
     * @param cName
     * @param mtdName
     * @param params
     */
    public void invokeMethod(String cName, String mtdName, Object[] params)
    {
        String className = objTool.get(cName);
        Object target = createObject(className);
        Class<?> targetClass = target.getClass();
        int length = params.length;
        Class<?>[] paramTypes = new Class<?>[length];
        for (int i = 0; i < length; i++)
        {
            paramTypes[i] = params[i].getClass();
        }
        try
        {
            Method method = targetClass.getMethod(mtdName, paramTypes);
            method.invoke(target, params);
        }catch (Exception e)
        {
            System.out.println("执行异常");
        }
    }

    /**
     * 反射显示 类 的内容(属性、方法)
     * @param cName 类名
     */
    public void showClass(String cName)
    {
        StringBuffer sbuf = new StringBuffer(1024);
        String className = objTool.get(cName);
        Object target = createObject(className);
        Class<?> targetClass = target.getClass();
        sbuf.append("类名:");
        sbuf.append(className);
        sbuf.append("\n\n");
        sbuf.append(Modifier.toString(targetClass.getModifiers()));
        sbuf.append(" class ");
        sbuf.append(cName);
        sbuf.append("\n{\n");
        writeFiels(sbuf, targetClass);
        writeConstructor(sbuf, targetClass);
        writeMethods(sbuf, targetClass);
        sbuf.append("}");
        System.out.println(sbuf.toString());
    }

    /**
     * 获取类的 方法 信息
     * @param sbuf 存储信息容器
     * @param targetClass 目标类
     */
    private void writeMethods(StringBuffer sbuf, Class<?> targetClass)
    {
        Method[] methods = targetClass.getDeclaredMethods();
        for (Method m : methods)
        {
            sbuf.append("\t");
            sbuf.append(Modifier.toString(m.getModifiers()));
            sbuf.append(" ");
            String returnType = m.getReturnType().getName();
            sbuf.append(returnType.substring(returnType.lastIndexOf('.') + 1));
            sbuf.append(" ");
            sbuf.append(m.getName());
            sbuf.append("(");
            Class<?>[] paramTypes = m.getParameterTypes();
            for (int i = 0; i < paramTypes.length; i++)
            {
                if (i > 0)
                    sbuf.append(", ");
                String paramName = paramTypes[i].getName();
                sbuf
                    .append(paramName.substring(paramName.lastIndexOf('.') + 1));
            }
            sbuf.append(");\n");
        }
    }

    /**
     * 获取类的 构造函数 信息
     * @param sbuf 存储信息容器
     * @param targetClass 目标类
     */
    private void writeConstructor(StringBuffer sbuf, Class<?> targetClass)
    {
        Constructor[] constructors = targetClass.getDeclaredConstructors();
        for (Constructor c : constructors)
        {
            sbuf.append("\t");
            sbuf.append(Modifier.toString(c.getModifiers()));
            sbuf.append(" ");
            String name = c.getName();
            sbuf.append(name.substring(name.lastIndexOf('.') + 1));
            sbuf.append("(");
            Class<?>[] paramTypes = c.getParameterTypes();
            for (int i = 0; i < paramTypes.length; i++)
            {
                if (i > 0)
                    sbuf.append(", ");
                sbuf.append(paramTypes[i]);
            }
            sbuf.append(");\n");
        }
        sbuf.append("\n");
    }

    /**
     * 获取类的 属性 信息
     * @param sbuf 存储信息容器
     * @param targetClass 目标类
     */
    private void writeFiels(StringBuffer sbuf, Class<?> targetClass)
    {
        Field[] fields = targetClass.getDeclaredFields();
        for (Field f : fields)
        {
            sbuf.append("\t");
            sbuf.append(Modifier.toString(f.getModifiers()));
            sbuf.append(" ");
            String fieldType = f.getType().getName();
            sbuf.append(fieldType.substring(fieldType.lastIndexOf('.') + 1));
            sbuf.append(" ");
            sbuf.append(f.getName());
            sbuf.append(";\n");
        }
        sbuf.append("\n");
    }

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        ReflectFactory rf = new ReflectFactory();
        rf.init();
        Object[] params = {};
        rf.invokeMethod("Person", "main", params);
    }

}