java的 反射机制,
java的 反射机制,
目录:
一.编译时与运行时
二.什么是反射
三.反射的运用
一.编译时与运行时
了解反射之前,必须先清楚编译时和运行时的区别。
编译时:将Java代码编译成.class文件的过程。
运行时:就是Java虚拟机执行.class文件的过程。
调用实例的方法:
1.编译时,是调用申明类型的成员方法,也就是所谓的编译时类型调用方法。
2.到运行时,调用的是实际的类型成员方法,也就是所谓的运行时类型的方法。
3.对于调用引用实例的成员变量,无论实在编译时还是运行时,都是调用编译时类型的成员方法。
二.什么是反射
在运行状态中,可以知道任意类的所有属性和方法,并且可以调用方法和属性。这就是反射。
反射的概念很简单,但我们要理解下,平时我们开发中,经常都是我要一个方法就引包,调用。这就造成的这个文件里面没有引用包就会报错,使用反射的技术就可以将这个耦合度降低。
实际运用中,如果我们有个需求是不想要使用原本的某个类如:LoginModel类的login方法。要改用LoginModel2的login2方法。我们使用反射的话就只需要改获取类的名字和获取类的方法名。
反射这个技术在我们开发中其实应用的非常的广泛,开源框架中就经常用到,如现在比较流行的Retorfit框架中,创建接口实例的方法源码内就有反射的应用。拥有注解功能的框架Xutils、Butterknife、Dragger等。Android中的类加载器通常都是运用了反射(如:Android的启动过程中Activity的对象的创建-newActivity(ClassLoader cl....)方法)。
三.反射的应用
下面是反射的调用方法步骤:
1.获取Class。
2.用Class的方法获取所要调用的方法Method。
3.再用Method的invoke方法进行调用。
下面说下调用方式:
1、获取Class对象的三种方式
1.1 Object ——> getClass(); (此种方式是在实例对象中获取的,都已经有对象了那就不需要再用反射了)
实际代码:
Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
Class stuClass = stu1.getClass();//获取Class对象
实际代码:
Class stuClass2 = Student.class;
1.3 通过Class类的静态方法:forName(String className)(这种方式最常用)
实际代码:
Class stuClass3 = Class.forName("fanshe.Student");
2.获取class的方法
我们拿到Class类后我们就可以用各种动态获取方法的方式,获取方法并且调用。
Class类里面有几个获取可调用方法的方法:
1.getMethods();//获取所有"公有方法",包含了父类的方法也包含Object类。
2.getDeclaredMethods();//获取所有的成员方法,包括私有的(不包括继承的)
4.getDeclaredMethod(String name,Class<?>... parameterTypes);//单独的获取指定方法(可获取私有的,但不可获取继承的)
参数: name : 方法名; Class ... : 形参的Class类型对象
3.调用方法
得到这些我们想用的方法后,我们就可以调用它们了,调用的方法是:
Object invoke(Object obj,Object... args): //obj : 要调用方法的对象; args:调用方式时所传递的实参;
很简单。如果看完觉得还是不是很懂,希望能够看些代码来熟悉下那么可以看下下面链接的文章,最好是能够自己也写上代码跟着看,会更深刻些。
Java基础之—反射(非常重要)
相关文章
- 暂无相关文章
用户点评