java反射机制

来源:互联网 发布:最伟大德国人知乎 编辑:程序博客网 时间:2024/05/19 18:47

Java反射机制

 一、定义:

JAVA反射机制是

在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意方法和属性;

这种动态获取信息以及动态调用对象方法的功能。

通俗点来说,反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。

二、反射的实现:

Java的反射机制的实现要借助于4个类:classConstructorFieldMethod;

其中class代表的是类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象。通过这四个对象我们可以粗略的看到一个类的各个组 成部分。其中最核心的就是Class类,它是实现反射的基础,它包含的方法我们在第一部分已经进行了基本的阐述。

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

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

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

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

在运行时调用任意一个对象的方法;生成动态代理。

三、java的内存模型

 

 

 

首先我们了解一下JVM,什么是JVM,Java的虚拟机,java之所以能跨平台就是因为这个东西,你可以理解成一个进程,程序,只不过他的作用是用来跑你的代码的。上图是java的内存模型,我们关注的点,一个方法区,一个栈,一个堆,初学的时候老师不深入的话只告诉你java的内存分为堆和栈,易懂点吧!


例如:
Object o=new Object();

运行时,首先JVM会启动,代码会编译成一个.class文件,然后被类加载器加载进jvm的内存中,类Object加载到方法区中,创建了Object类的class对象到堆中,注意这个不是new出来的对象,而是类的类型对象,每个类只有一个class对象,作为方法区类的数据结构的接口。jvm创建对象前,会先检查类是否加载,寻找类对应的class对象,若加载好,则为对象分配内存,初始化也就是代码:new Object()。

上面的流程就是将写好的代码扔给jvm去跑,跑完就over了,jvm关闭,程序也停止了

 

应用反射时我们最关心的一般是一个类的构造器、属性和方法,下面我们主要介绍Class类中针对这三个元素的方法:(java.lang.Class)

1.了解class                                                          

    1、Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性
    2、对象照镜子后(反射)可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。
    3、对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。
        一个 Class 对象包含了特定某个类的有关信息。
    4、Class 对象只能由系统建立对象
    5、一个类在 JVM 中只会有一个Class实例

2.Class类中存在以下几个重要的方法:                                                                                                                                                                                                                                                                     

 

1.getName()

一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。

 

2.newInstance()

该方法可以根据某个Class对象产生其对应类的实例。需要强调的是,它调用的是此类的默认构造方法。例如:

MyObject x = new MyObject();

MyObject y = x.getClass().newInstance();

 

3.getClassLoader()

返回该Class对象对应的类的类加载器。

 

4.getComponentType()

该方法针对数组对象的Class对象,可以得到该数组的组成元素所对应对象的Class对象。例如:

int[] ints = new int[]{1,2,3};

Class class1 = ints.getClass();

Class class2 = class1.getComponentType();

而这里得到的class2对象所对应的就应该是int这个基本类型的Class对象。

 

5.getSuperClass()

返回某子类所对应的直接父类所对应的Class对象。

 

6.isArray()

判定此Class对象所对应的是否是一个数组对象。

 

3.反射机制获取类有三种方法                                                                                                                                                             

 

//通过.class

 

 //2 通过对象的getClass()方法获取,这个使用的少


 //3 通过全类名获取,用的比较多,但可能抛出  ClassNotFoundException异常  

    c = Class.forName("com.java.reflection.Person");  

System.out.println("通过全类名获取: " + c);

通过类名: class com.java.reflection.Person
无参构造器
通过getClass(): class com.java.reflection.Person
通过全类名获取: class com.java.reflection.Person

 

 

更深刻的理解:案例描述

首先一个类

 

 

再写个方法调用类:

 

调用自定义的方法:

 

 

反射的作用:

 

 

 

 

 

 

由上所述:通过java反射,获取一个类下边所有的属性和方法,继而得到一个类或一个对象各种信息,从而调用某个方法,获取方法名以及让该对象依据方法名调用该方法。

在数据库中,jdbc加载驱动就用到了反射class.forname(“”)  它可以让我们通过一个字符串找到一个类;

在项目开发中多用在编写工具类,以简化代码。例如,StrutsHibernatespring框架,通过反射把前台数据封装到后台。

原创粉丝点击