Java反射

反射

Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

反射是框架的灵魂,它可以有效地降低类之间的耦合,很多框架都运用了反射原理,例如hibernate 的实体类,Spring的AOP等等都有反射的实现。

获取公共构造器 getConstructors()

获取所有构造器 getDeclaredConstructors()

获取该类对象 newInstance()

获取类名包含包路径 getName()

获取类名不包含包路径 getSimpleName()

获取类公共类型的所有属性 getFields()

获取类的所有属性 getDeclaredFields()

获取类公共类型的指定属性 getField(String name)

获取类全部类型的指定属性 getDeclaredField(String name)

获取类公共类型的方法 getMethods()

获取类的所有方法 getDeclaredMethods()

获得类的特定公共类型方法: getMethod(String name, Class[] parameterTypes)

获取内部类 getDeclaredClasses()

获取外部类 getDeclaringClass()

获取修饰符 getModifiers()

获取所在包 getPackage()

获取所实现的接口 getInterfaces()

反射

从图中可以得出以下几点:

Class 类的实例对象表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有很多的实例,每个类都有唯一的Class对象。
Class 类没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机自动构造的。也就是说我们不需要创建,JVM已经帮我们创建了。
Class 对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法

1、获取类对象

获取类对象有3种方式

Class.forName()(常用)

Hero.class

new Hero().getClass()

在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样。(此处准确是在ClassLoader下,只有一个类对象)

三种方式中,常用第一种,第二种需要导入类的包,依赖太强,不导包就抛编译错误。第三种对象都有了还要反射干什么。一般都第一种,一个字符串可以传入也可写在配置文件中等多种方法。

基本步骤

与传统的通过new 来获取对象的方式不同反射机制,反射会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象”再通过构造器对象创建一个对象,具体步骤:

1.获取类对象 Class class = Class.forName(“pojo.Hero”);

2.获取构造器对象 Constructor con = clazz.getConstructor(形参.class);

3 获取对象 Hero hero =con.newInstance(实参);

2、获取构造器对象方法

1).批量的方法:

public Constructor[] getConstructors():所有"公有的"构造方法

public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

2).获取单个的方法:

public Constructor getConstructor(Class… parameterTypes): 获取单个的"公有的"构造方法

public Constructor getDeclaredConstructor(Class…parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;

3、获取成员变量并使用

1.获取HeroPlus类的对象 new方法/第2章中的方法 h

  1. 获取属性 Field f1 = h.getDeclaredField(“属性名”)

  2. 修改属性 f1.set(h,实参),注意这里的h是对象,不是类对象

补充:

getField和getDeclaredField的区别

getField 只能获取public的,包括从父类继承来的字段。

getDeclaredField 可以获取本类所有的字段,包括private的,但是 不能获取继承来的字段。 (注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))

4、获取成员方法并使用

获取HeroPlus类的对象 h

获取成员方法:

public Method getMethod(String name ,Class<?>… parameterTypes):获取"公有方法";(包含了父类的方法也包含Object类)

public Method getDeclaredMethods(String name ,Class<?>… parameterTypes) :获取成员方法,包括私有的(不包括继承的)

参数解释:

name : 方法名;

Class … : 形参的Class类型对象

调用方法

Method --> public Object invoke(Object obj,Object… args):

参数说明:

obj : 要调用方法的对象;

args:调用方式时所传递的实参; 反射一般使用在框架中,框架需要很强的灵活性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章