Java高级特性--反射

30
五月
2021

Java高级特性–反射

Java类加载机制

类的加载步骤

①JVM将A.class文件读入内存方法区

②JVM为A.class创建唯一的Class类的对象

在这里插入图片描述

反射的定义

​ 通过Class类的对象可以

​ 获取类的属性、方法

​ 生成类的实例

​ 调用实例的方法-属性

​ 反射

​ 通过操作class类的对象

​ 实现对类的操作

​ 实现对对象的操作

在这里插入图片描述

基于反射获取类信息

​ 需求

​ 获取类的公有和私有属性

​ 获取类的公有和私有方法

​ 用到的反射的类

​ java.lang.class;

​ java.lang.reflect.Field

​ java.lang.reflect.Method

在这里插入图片描述

Class常用方法

(1)获取Class对象

1.通过Class类的静态方法Class.forName(className) (比较常用的方式)

2.调用对象实例的getClass()方法

3.调用某个类的class属性

(2)Class类中常用的方法

1.获取属性的方法(返回Field类)

getFields() 所有可访问的公共字段(public修饰的字段)

getDeclaredFields() 所有字段

getField(String name) 返回一个特定的公共字段对象

2.获取方法(返回Method类)

getMethods() 所有公共方法,包括从超类(父类)和超接口继承的声明

getDeclaredMethods() 所有方法,但不包括继承的方法

getMethod(String name,Class[]parameterTypes) 返回一个方法对象

(String name 代表方法名,Class[]parameterTypes代表参数类型,无参写null)

getDeclaredMethod(String name,Class[]parameterTypes) 从所有方法中选择特定方法,如果要选用私有方法,需要结合setAccessible(true)(允许私有方法调用)使用。

(3)获取构造方法

getConstructor(Class[]parameterTypes) 返回一个构造方法对象

通过Constructor的newInstance(Object[]initargs)可生成类的实例

通过Method的invoke(Object obj,Object[]args),可在具有指定参数的方法对象上调用此方法对象表示的基础方法。

示例:

	//1.将类的信息装载到jvm中
	Class cla = Class.forName("cn.ref.ChildrenDayPS");
	//2.获取无参构造方法
	Constructor constructor =cla.getConstructor();
	//3.使用反射实例化对象
	Object ps =constructor.newInstance();
	//4.获取打折的方法
	Method method =cla.getMethod("promoteSales",String.class);
	//5.调用实例对象的打折方法
	Double discount = (Double)method.invoke(ps,"1");

使用反射的优缺点

​ 优点:

​ (1)运行期类型的判断,动态类加载

​ (2)提高了程序的灵活性、扩展性,降低耦合性

​ (3)提高自适应能力,无需提前硬编码目标类

​ 缺点:

​ (1)性能问题

​ (2)安全限制

​ (3)内部暴露

​ 反射应用场景:

​ (1)反射机制是目前众多Java框架实现的基础,如:

​ JDBC

​ Hibernate

​ Spring AOP.IoC

​ 分布式微服务

​ (2)实现项目安装插件功能

​ 基于反射,架构师搭建项目框架,自行封装框架,使得项目更加组件化和通用化。

TAG

网友评论

共有访客发表了评论
请登录后再发布评论,和谐社会,请文明发言,谢谢合作! 立即登录 注册会员