5-1 Java 方法反射的基本操作

来源:互联网 发布:sftp登录 端口号 编辑:程序博客网 时间:2024/05/29 09:08
  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    }
原创粉丝点击