• 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);
        }
    
    }
    

      

  • 相关阅读:
    关于Unity中调试C#的方法
    关于Unity的C#基础学习(二)
    关于代码命名规范
    关于Unity的C#基础学习(一)
    关于Unity的游戏的运行模式
    关于Unity的组件和作用
    关于Unity的开发模式
    关于Unity的坐标系
    关于Unity中场景视图的使用
    sql 追踪 神器
  • 原文地址:https://www.cnblogs.com/ph123/p/5673418.html
Copyright © 2020-2023  润新知