欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java的 反射机制,

来源: javaer 分享于  点击 22165 次 点评:26

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对象  

1.2 任何数据类型(包括基本数据类型)都有一个“静态”的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();//获取所有的成员方法,包括私有的(不包括继承的) 


3.getMethod(String name,Class<?>... parameterTypes)://单独的获取指定方法(可获取公有方法和继承的方法) 

4.getDeclaredMethod(String name,Class<?>... parameterTypes);//单独的获取指定方法(可获取私有的,但不可获取继承的) 

参数: name : 方法名; Class ... : 形参的Class类型对象 


3.调用方法

得到这些我们想用的方法后,我们就可以调用它们了,调用的方法是:

Object invoke(Object obj,Object... args): //obj : 要调用方法的对象; args:调用方式时所传递的实参; 


很简单。如果看完觉得还是不是很懂,希望能够看些代码来熟悉下那么可以看下下面链接的文章,最好是能够自己也写上代码跟着看,会更深刻些。

Java基础之—反射(非常重要)

相关文章

    暂无相关文章
相关栏目:

用户点评