java中的反射机制

来源:互联网 发布:怎么用php设计网站 编辑:程序博客网 时间:2024/05/01 11:39

一,反射的概念:

    主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。    反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!

二,反射机制的作用:

    1、反编译:.class-->.java    2、通过反射机制访问java对象的属性,方法,构造方法等;

三、执行步骤:

1、获取类的对象:

//第一种方式:  Classc1 = Class.forName("Employee");  //第二种方式:  //java中每个类型都有class 属性.  Classc2 = Employee.class;  //第三种方式:  //java语言中任何一个java对象都有getClass 方法  Employee e = new Employee();  Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee) 

2、获取类的属性和方法:

(1)获取属性:

            //获取整个类              Class c = Class.forName("java.lang.Integer");               //通过创建fs存储获取的所有的属性             Field[] fs = c.getDeclaredFields();              //定义可变长的字符串,用来存储属性              StringBuffer sb = new StringBuffer();              //通过追加的方法,将每个属性拼接到此字符串中              //最外边的public定义              sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");              //里边的每一个属性              for(Field field:fs){                  sb.append("\t");//空格                  sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等                  sb.append(field.getType().getSimpleName() + " ");//属性的类的名字                  sb.append(field.getName()+";\n");//属性的名字+回车              }              sb.append("}");              System.out.println(sb); 

(2)获取方法:

Method method = cla.getDeclaredMethod(methodName, HttpServletRequest.class , HttpServletResponse.class);//括号中第一个参数是方法名,后面的参数为方法中的参数

3、设置方法权限:(如果方法的访问权限为public,则可以不设置)

method.setAccessible(true);

4、执行方法:

method.invoke(this, request , response);

四、实例:

//获取用户传递的请求参数        String methodName = request.getParameter("method");    //通过方法名获取到方法的对象    //获取当前类的Class对象        Class cla = this.getClass();    //获取cla的的方法(Method对象)    //getDeclaredMethod需要两个参数,方法名和参数名    //因为在java需要通过方法名和参数列表来确定一个方法        try {            //获取方法对象            Method method = cla.getDeclaredMethod(methodName, HttpServletRequest.class , HttpServletResponse.class);            //设置方法的访问权限            method.setAccessible(true);            //调用方法            //invoke用于调用一个方法,第一个参数时要调用方法的对象,剩下是调用方法需要的参数            method.invoke(this, request , response);        } catch (Exception e) {            e.printStackTrace();        }

通过反射获取方法或构造方法的方法:

方法 含义 getDeclaredMethods() 获取所有的方法 getReturnType() 获得方法的放回类型 getParameterTypes() 获得方法的传入参数类型 getDeclaredMethod(“方法名”,参数类型.class,……) 获得特定的方法 构造方法 含义 getDeclaredConstructors() 获取所有的构造方法 getDeclaredConstructor(参数类型.class,……) 获取特定的构造方法 父类和父接口 含义 getSuperclass() 获取某类的父类 getInterfaces() 获取某类实现的接口