反射是什么?反射是Java程序开发语言的特征之一,它允许动态地发现和绑定类、方法、字段,以及所有其他的由于有所产生的的元素。通过反射,能够在需要时完成创建实例、调用方法和访问字段的工作。 反射机制主要提供功能
反射在牛逼框架中的使用
反射中,Class.forName 和 ClassLoader 区别?这两者,都可用来对类进行加载。差别在于:
反射的常用类Java中反射相关的类大部分都在rt.jar下
Class类的实例表示正在运行的Java类和接口。
提供有关类或者接口的属性信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。有点绕,慢慢体会吧。
提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Filed类封装类反射类的属性,而Constructor类则封装类反射类的构造方法。
提供关于类和接口上单个方法的信息。所反映的方法可能是类方法或者实例方法(包括抽象方法)。这个类不难理解,他的作用就是用来封装反射类方法的一个类。
提供了用于解码类和成员访问修饰符的静态方法和常量。修饰符集合被表示为具有表示不同修饰符的不同位位置的整数。
提供了动态创解决数组和访问数组的静态方法,该类中的所有方法都是静态方法。 反射的优缺点优点
缺点
探索 Classjava文件编译后变成class文件,class文件被类加载器加载到内存中,并且JVM根据其字节数组创建了对应的Class对象。 Class类是Java反射的起源,针对任何一个我们想使用的类,只有先为它产生一个Class对象,接下来就可以通过Class对象获取其他的信息。 JVM为每个类管理着一个独一无二的Class对象,当我们需要创建每个类的对象时,JVM会检查所要加载的类对应的Class对象是否已经存在。不存在,则JVM会根据类加载机制加载并创建对应的Class对象,最后使用Class对象创建出我们通常使用的实例对象。 获取Class类的三种方式1.调用Object类的 2.使用Class类的 3.使用.class获取该类性的Class对象。 Class常用方法方法非常之多。 获取类信息了解了Java反射的详细细节之后,我们可以使用反射机制来获取类中的信息。 创建对象使用无参构造方法创建对象比如说下面这段代码: Class clazz = Class.forName("java.lang.String"); 这里需要注意,这个类必须是有无参构造方法,不然这种方式会报错的。 使用有参构造方法可以使用三个步骤来完成: 1.获取指定类对应的Class对象 2.通过Class对象获取满足指定参数类型要求的构造方法类对象 3.调用指定的Constructor对应的 Class clazz = Class.forName("java.lang.String"); 这样就创建了一个String对象实例。 调用方法前面已经聊过Method这个类,我们可以通过Method类中的invoke方法动态调用器方法。 public final class Method extends Executable { 这个方法的第一个参数是一个对象类型,表示要在指定的这个对象上调用这个方法(方法名称)。第二个参数是可变参数,用来给这个方法传递参数值; invoke方法里返回的值用来表示动态调用指定方法后的返回值。如果调用私有的方法,先调用 访问成员变量的值使用反射可以获取类的成员变量的对象代表,成员变量的对象代表是
比如说: 操作数组数组也是一个度一项,可以通过反射来查看数组的各个属性的信息,比如 ingt [] intArr=new Int[10]; 反射与动态代理代理模式是Java中使用频率相当高的设计模式之一,尤其是在牛逼的框架中,Spring,Mybatis,Dubbo等框架中。 其中反射就是一个很好的应用。 静态代理模式我们就没有必要提他了,相当于一个业务需要代理,你就得给他搞一个代理类。全是手动搞出来的。 动态代理的原理就是,在程序运行时候根据需要动态地创建目标类的代理对象,典型应用场景:
关于动态代理,后面有专门的文章分析。 到此我们的反射相关的意见讲完了。具体还是建议自己下去手动敲敲代码,体会一下,便于更深刻的理解。 总结面试被问到,建议回答以下几个方面的内容: 1.反射是什么 2.提供了什么功能 3.常用类有哪些 4.优缺点是什么 5.其他框架中国的应用(动态代理) |
|