JAVAJ基础学习之反射机制

一、语言的动态性介绍

强类型语言(静态类型语言)是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行。例如C/C++/Java

/C#弱类型语言(动态类型语言)是指不需要进行变量/对象类型声明的语言,一般情况下不需要编译(但也有编译型

的)。

二、java语言的动态性----反射

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

能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

三、反射相关的API

1.java.lang包下
Class<T>:表示一个正在运行的 Java 应用程序中的类和接口,是Reflection的起源

2.java.lang.reflect包下
Field 类:代表类的成员变量(也称类的属性)
Method类:代表类的方法
Constructor 类:代表类的构造方法
Array类:提供了动态创建数组,以及访问数组的元素的静态方法
.

四、Class<T>

1.类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生一个Class对象

2.Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自

动构造的,因此不能显式地声明一个Class对象

3.Class是Reflection起源。要想操纵类中的属性和方法,都必须从获取Class object开始

五、获取Class Object的方法

六、通过反射实例化对象

平常情况我们通过new Object来生成一个类的实例,但有时候我们没法直接new,只能通过反射动态生成。
实例化无参构造函数的对象,两种方式:
①Class. newInstance();
②Class. getConstructor (new Class[]{}).newInstance(new Object[]{})
实例化带参构造函数的对象:
clazz. getConstructor(Class<?>... parameterTypes) . newInstance(Object... initargs) 

首先我们新建一个JavaBean—User,User继承自另一个Bean—BaseUser。

举例准备


实例化

七、通过反射动用Method(方法)

1. 获得当前类以及超类的public Method:
Method[] arrMethods = classType. getMethods();

2. 获得当前类申明的所有Method:
Method[] arrMethods = classType. getDeclaredMethods();

3. 获得当前类以及超类指定的public Method:
Method method = classType. getMethod(String name, Class<?>... parameterTypes);

4. 获得当前类申明的指定的Method:
Method method = classType. getDeclaredMethod(String name, Class<?>... parameterTypes)

5.通过反射动态运行指定Method:
Object obj = method. invoke(Object obj, Object... args)



八、通过反射调用Field(变量)

1.  获得当前类以及超类的public Field:
Field[] arrFields = classType. getFields();

2. 获得当前类申明的所有Field:
Field[] arrFields = classType. getDeclaredFields();

3. 获得当前类以及超类指定的public Field:
Field field = classType. getField(String name);

4. 获得当前类申明的指定的Field:
Field field = classType. getDeclaredField(String name); 

5. 通过反射动态设定Field的值:
fieldType.set(Object obj, Object value);

6. 通过反射动态获取Field的值: 
Object obj = fieldType. get(Object obj) ;


九、JAVA反射总结

1. 只要用到反射,先获得Class Object

2. 没有方法能获得当前类的超类的private方法和属性,你必须通过getSuperclass()找到超类以后再去尝试获得

3. 通常情况即使是当前类,private属性或方法也是不能访问的,你需要 设置压制权限setAccessible(true)来取得

private的访问权。但说实话,这已经破坏了面向对象的规则,所以除非万不得已,请尽量少用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值