JAVA 反射机制

来源:互联网 发布:文本框空js弹出遮罩层 编辑:程序博客网 时间:2024/06/16 18:30

          要了解Java的反射机制,首先要知道反射机制的概念。

           所谓反射机制,就是“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。基于这种看法,我、就我们所了解的Perl,Python是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods

        下面我们以这代码来进一步了解一下Java的反射机制。

class Demo{public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {          Class ownerClass = owner.getClass();          Class[] argsClass = new Class[args.length];          for (int i = 0, j = args.length; i < j; i++)   {              argsClass[i] = args[i].getClass();          }           Method method = ownerClass.getMethod(methodName, argsClass);              return method.invoke(owner, args);      } }

Class owner_class = owner.getClass():首先还是必须得到这个对象的类46行:配置参数的数组,作为寻找Method的条件。

Method method =ownerClass.getMethod(methodName,argsClass):通过Method名和参数的数组得到要执行的Method

method.invoke(owner,args):执行该Methodinvoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。

接着我们来了解一下Java反射机制的几种功能:

Java反射机制主要提供了以下功能:

    1.在运行时判断任意一个对象所属的类;

    2.在运行时构造任意一个类的对象;

    3.在运行时判断任意一个类所具有的成员变量和方法;

    4.在运行时调用任意一个对象的方法;

    5.生成动态代理。

通常我们谈会到动态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等。然而“动态”

没有其固定的意义,它是相对与“静态”而言的。

       这里有几种Java 反射机制的使用方法:

        1、获取一个Class对象     

        Class c = this.getClass();ReflectImplement r = new ReflectImplement();//通过类实例获得 Class c1 = r.getClass(); Class subClass = c1.getSuperclass();//通过类实例获得父类对象  Class c2 = ReflectImplement.class;//通过类名.class获得 Class c3 = Class.forName("ReflectImplement");//通过类名字符串获得

        2、获得类名称

        3、修饰符Modifier

        Modifier.toString(c2.getModifiers())//类的修饰符         Field[] fields1 = c2.getDeclaredFields();//该方法访问         Modifier.toString(field1[0].getModifiers())

        4、检索类的构造函数 

        Constructor[] constructor = c1.getDeclaredConstructors();for(int i = 0; i < constructor.length; i++){Constructor cstr = constructor[i];System.out.print("\n" + cstr.getName());System.out.print("\n" + cstr.getDeclaringClass());Class[] cp = cstr.getParameterTypes();for(int j = 0; j < cp.length; j++){System.out.print("\n" + cp[j]);}

        5、检索类的方法 

        Method [] methods = c1.getDeclaredMethods();for(int i = 0; i < methods.length; i++){Method method = methods[i];Class cp[] = method.getParameterTypes();//该方法对应的参数类型method.getExceptionTypes();}

        6、检索类所有成员

        Field[] fields = c2.getFields();//该方法只能访问公共变量 for(int i = 0; i < fields.length; i++){String str = fields[i].getName() + "" + fields[i].getType().getName();}Field[] fields1 = c2.getDeclaredFields();//该方法访问所有变量 






0 0
原创粉丝点击