反射机制马剑威第133讲课程大纲1、什么是反射2、Class类3、通过Class类取得类信息4、通过Class类调用属性或方法5、动态代理1、什么是反射•反射:Reflection类信息对象对象类信息2、Class类•Class类是一切的反射根源。•Class类表示什么?•很多的人——可以定义一个Person类(有年龄,性别,姓名等)•很多的车——可以定义一个Car类(有发动机,颜色,车轮等)•很多的类——Class类(类名,构造方法,属性,方法)•得到Class类的对象有三种方式:•第一种形式:Object类中的getClass()方法•第二种形式:类.class•第三种形式:通过Class类的forName方法:•2、Class类•使用Class类进行对象的实例化操作•调用无参构造进行实例化–publicTnewInstance()throwsInstantiationException,IllegalAccessException•调用有参构造进行实例化–publicConstructor?[]getConstructors()throwsSecurityException3、通过Class类取得类信息取得类所在的包•publicPackagegetPackage()//得到一个类所在的包•publicStringgetName()//得到名字取得一个类中的全部方法•publicMethod[]getMethods()•publicintgetModifiers()//Modifier.toString(mod);//还原修饰符•publicClass?getReturnType()•publicClass?[]getParameterTypes()•publicClass?[]getExceptionTypes()•publicstaticStringtoString(intmod)取得一个类中的全部属性•publicField[]getFields()•publicField[]getDeclaredFields()•publicClass?getType()•publicintgetModifiers()•publicStringgetName()4、通过Class类调用属性或方法调用类中的方法•调用类中的方法,传入实例化对象,以及具体的参数内容•publicObjectinvoke(Objectobj,Object...args)直接调用属性•取得属性•publicObjectget(Objectobj)•//设置属性,等同于使用“=”完成操作•publicvoidset(Objectobj,Objectvalue)•//让属性对外部可见•publicvoidsetAccessible(booleanflag)5、动态代理•所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联。•java动态代理主要是使用java.lang.reflect包中的两个类。InvocationHandler类•publicObjectinvoke(Objectobj,Methodmethod,Object[]obs)•其中第一个参数obj指的是代理类,method是被代理的方法,obs是指被代理的方法的参数组。此方法由代理类来实现。5、动态代理Proxy类•protectedProxy(InvocationHandlerh);•staticClassgetProxyClass(ClassLoaderloader,Class[]interfaces);•staticObjectnewProxyInstance(ClassLoaderloader,Class[]interfaces,InvocationHandlerh);•动态代理其实是在运行时生成class,所以,我们必须提供一组interface,然后告诉他class已经实现了这些interface,而且在生成Proxy的时候,必须给他提供一个handler,让他来接管实际的工作。谢谢Thanks