java反射基础

package com.reflex.util;

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

/**
 * Created by Administrator on 2016/7/15.
 */
public class ReflexUtil {


    /**
     * 通过反射获取当前对象的所有方法及方法属性
     *
     * @param object
     */
    public static void getClassMethods(Object object) {
        Class clazz = object.getClass();

        /**
         * clazz.getMethods() 获取所有非私有的方法,包括继承过来的
         *
         * clazz.getDeclaredMethods() 获取当前类的所有方法包括私有方法,但不包括父类继承的方法
         */
        Method[] methods = clazz.getMethods();

        StringBuffer sb = new StringBuffer();
        for (Method method : methods) {
            //获取方法返回值类型
            Class returnType = method.getReturnType();

            sb.append(returnType.getName()).append("(");

            //获取当前方法的所有参数
            Class[] parameters = method.getParameterTypes();


            if (parameters.length != 0) {
                //遍历参数数组
                for (Class paramterClazz : parameters) {
                    sb.append(paramterClazz.getName()).append(",");
                }
                sb.deleteCharAt(sb.length() - 1);
            }
            sb.append(")");
            System.out.println(sb.toString());
            sb.delete(0, sb.length());
        }

    }


    /***
     * 获取当前类的所有属性  包括私有但不包括从父类继承过来的属性
     *
     *
     * @param object
     */
    public static  void getFields(Object object){
        Class clazz=object.getClass();

        /**
         * clazz.getFields() 获取该类的所有的非私有方法,包括父类继承过来的
         *
         * clazz.getDeclaredFields() 获取该类的所有方法,包括私有方法,但不包括父类继承过来的方法
         */
        Field[] fields=clazz.getDeclaredFields();

        for (Field field :fields){
            System.out.println(field.getType()+"  "+field.getName());
        }
    }


    /**
     * 通过反射执行object的方法
     * @param object
     */
    public static void reflexCallMethod(Object object){

        Class clazz=object.getClass();
        Method method=null;
        try {
            /**
             * 获取方法对象
             *
             * 参数为方法名,tostring()方法因为没有参数 就可以这么写clazz.getMethod("toString")
             *
             * invoke方法的第二个参数为可变参数   通过反射调用的方法有参数时,可以传数组也可以单个单数的传递
             *
             * 数组
             *      Class[] clazzes=new Class[]{int.class,int.class};
             *      clazz.getMethod("toString",new Class[]);
             *
             * 单个参数
             *       clazz.getMethod("toString",int.class,int.calss);
             *
             */
            method=clazz.getMethod("testMethodReflex",int.class,int.class);
            //通过反射调用testMethodReflex方法
            method.invoke(object,10,20);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

测试类:

package com.reflex.test;

import com.reflex.util.ReflexUtil;
import org.junit.Test;

/**
 * Created by Administrator on 2016/7/15.
 */
public class ReflexTest {

    @Test
    public void getClassMethod(){
        String str="11";

        //ReflexUtil.getClassMethods(str);
        //ReflexUtil.getFields(str);
        ReflexUtil.reflexCallMethod(new ReflexTest());
    }

    public void testMethodReflex(int a,int b){
        System.out.println(a+b);
    }

}

  

posted @ 2016-07-15 14:20  名字也要唯一  阅读(365)  评论(0编辑  收藏  举报