Java反射(五)-Java 方法反射的基本操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011741311/article/details/77419061
  1. 如何获取某个方法。方法的名称和方法的参数列表才能唯一决定某个方法
  2. 方法反射的操作。method.invoke(对象,参数列表)
package com.imooc.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by Administrator on 2017/8/20 0020.
 */
public class MethodDemo {
    public static void main(String[] args) {
        //要获取print(int,int)方法 1. 要获取一个方法就是要获取类的信息,获取类的信息首先要获取类的类类型
        A a = new A();
        Class class1 = a.getClass();
        /*
             2.获取方法 名称和参数列表来决定
             getMethod获取的是public的方法
             getDeclaredMethod获取的是自己声明的方法
         */

        try {
//            Method method1 = class1.getDeclaredMethod("print",new Class[]{int.class,int.class});
            Method m = class1.getDeclaredMethod("print",int.class,int.class);
            //方法的反射操作
            //a.print(10,20);方法的反射操作是用m对象来进行方法调用 和a.print调用效果是一样的
            //用print的方法对象m来操作a
            //如果方法有具体的返回值,o就得到返回类型,方法如果没有返回值,返回null
//            Object o = m.invoke(a,new Object[]{10,20});
            Object o = m.invoke(a,10,20);

            System.out.println("======================================");
            Method m1 = class1.getMethod("print",String.class,String.class);
            o = m1.invoke(a,"hello","world");

            System.out.println("======================================");
            Method m2 = class1.getMethod("print");
//            class1.getMethod("print",new Class[]{});
            o = m2.invoke(a,new Object[]{});
//            o = m2.invoke(a);


        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }


    }
}

class A {

    public void print() {
        System.out.println("helloworld".toUpperCase());
    }

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

    public void print(String a,String b) {
        System.out.println(a.toUpperCase()+"," + b.toLowerCase());
    }
}

例子,打印出当前对象的所有属性名和属性的值

/**
     * toString方法,返回属性名称及值
     * @return  属性名称及值,格式:[name]张三 [sex]男
     */
    public String toString(){
        StringBuffer result = new StringBuffer();
        try {
            //获取 泛型为Object以及Object的所有子类 类的类类型
            Class<? extends Object> clazz = this.getClass();
            //获取当前类类自己声明的成员变量
            Field [] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                //获取成员变量的名称
                String fieldName = field.getName();
                //如果得到的是序列化,跳过。
                if ("serialVersionUID".equals(fieldName)) {
                    continue;
                }
                //拼接方法名:"get"+方法名 得到如:getId 形式的字符串
                String methodName = "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1, fieldName.length());
                Method method; //Method类,方法对象。一个成员方法就是一个Method对象
                Object resultObj;
                method = clazz.getMethod(methodName); //得到方法名为methodName的方法对象
                resultObj = method.invoke(this); //方法反射,得到属性的值
                if (resultObj != null && !"".equals(resultObj)) { //如果属性值不为空,则按规则拼接 属性名 和 属性的值
                    result.append("[").append(fieldName).append("]").append(resultObj).append(" ");
                }
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return result.toString(); //将StringBuffer转换成String
    }

猜你喜欢

转载自blog.csdn.net/u011741311/article/details/77419061
今日推荐