当前位置: 移动技术网 > IT编程>开发语言>Java > java反射-使用反射来操纵方法

java反射-使用反射来操纵方法

2019年05月17日  | 移动技术网IT编程  | 我要评论

一个类的主要成员时方法,辣么我们通过反射获取到一个类的所有方法信息后,总的寻找一种方式去操作调用这些方法,这样反射才有意义有意思。

method对象有一个方法invoke。      public object invoke(object obj, object... args) throws illegalaccessexception,illegalargumentexception,invocationtargetexception。    该方法的解释api解释为:

对带有指定参数的指定对象调用由此 method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。 
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。 

如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。 

如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 java language specification, second edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。 

如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。 

如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。 

  下面我用arraylist 类来做了一个测试:

import java.lang.annotation.annotation;
import java.lang.reflect.constructor;
import java.lang.reflect.field;
import java.lang.reflect.method;
import java.lang.reflect.parameter;
import java.util.arraylist;

/**
 * java反射 工具类
 */
public class classutil {
    /**
     * 通过反射操作对象方法
     */
    public static void method() {
        try {
            // 本例中传入的是arraylist 对象,就以arraylist 对象的add方法为例
            arraylist arraylist = new arraylist();
            // 1.获取该类的类类型
            class c = arraylist.getclass();
            // 2.获取该类自己定义的所有方法
            method[] methods = c.getdeclaredmethods();
            // 3.得到所有方法列表信息
            for (method method : methods) {
                system.out.print(method.getname() + "(");
                class[] parametertypes = method.getparametertypes();
                for (int i = 0, len = parametertypes.length; i < len; i++) {
                    system.out.print(parametertypes[i].getname());
                    if (i != len - 1) {
                        system.out.print(",");
                    }
                }
                system.out.print(")\n");
            }
            // 4.使用方法 invoke 来操作方法 add
            method method = c.getmethod("add", new class[]{object.class});
            method.invoke(arraylist, "测试1");
            method.invoke(arraylist, 100);
            method.invoke(arraylist, 100.0f);

            // 5.测试打印 arraylist 对象
            system.out.println("================" + arraylist);
        } catch (exception e) {
            e.printstacktrace();
        }
    }

    public static void main(string[] args) {
        classutil.method();
    }
}

  对于java集合中的泛型,是用于在编译阶段程序员输入验证的,我们可以通过反射的方式,来绕过这种输入验证。如上面的栗子,我们将 arraylist<string> arraylist = new arraylist(); 指定泛型为string类型,其他代码不变,你会发现,打印输出的结果还是一样。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网