java反射(上课笔记)

本文详细介绍了Java反射机制,包括如何获取Class对象、类的基本操作、构造函数、方法、字段的操作,以及实例化对象和调用方法。通过反射,可以在运行时动态地获取类的信息并操作类的成员,常用于实例化未知类的对象、调用方法和修改属性值等场景。
摘要由CSDN通过智能技术生成

注:内容来源于上课笔记,如有侵权请联系删除!

简介

反射(Reflection) 是一种运行时检视(Inspect)类型信息并且可以动态操作类中的一切成员的一种机制。它常常用于如下一些场景中:

  • 运行时实例化类的对象,比如实例化一个Servlet类,此Servlet类的名字容器预先是不知道的
  • 运行时调用方法,比如调用Servlet对象的service方法
  • 运行时修改属性值.比如Apache DbUtils工具库可以把数据库的一条记录默认依据名称相同的策略赋值一个对象的字段.

JDK中关于反射的相关类型都在java.lang.reflect包下,并不需要额外的第三方包来完成反射的工作.

Class对象

当jvm加载一个class文件到内存后,会为其创建一个唯一的Class对象(注意:同一个类加载器的前提)。所以我们可以理解为,Class对象就是一个class文件被加载到jvm中后的运行时表现。而反射的首要任务就是得到Class对象.得到Class对象的方法如下:

  • Class.forName(“类的全称”)
  • 类的class字段
  • 对象的getClass方法

Class.forName()

这种方法适合只知道类的字符串表示,也就是全称的情况.如果类还没有加载它还会加载此类,如果已经加载了就会返回已加载的class对象给你,比如:

Class personCls = Class.forName("com.Person");

类的class字段

这种方式是此类已经预先知道的情况下就非常合适,比如下面的代码

Class personCls = Person.class;
Class integerCls = Integer.class;

对于8个基本类型想获取其class对象信息除了可以用class字段的方式以外还可以利用其对应包装类型的TYPE字段来获取,比如:

Class intCls = int.class;
Class intCls = Integer.TYPE;

对象的getClass方法

这种方式适合于已经有此类对象的情况下来获取类的class对象信息,比如下面的代码

Person p = new Person();
Class personCls = p.getClass();

Void类对象

java方法的返回类型中有一个特殊的值就是void,使用java.lang.Void类来表示。所以获取此特殊的Class对象就用Void的class字段或TYPE字段来实现

Class<Void> clazz = Void.class;
Class<Void> clazz = Void.TYPE;

Class对象的基本操作

有了Class对象之后,我们就可以利用它来获取类中各种各样的信息,主要可以获取的信息有如下一些

  • 获取类的名字
  • 类的父类
  • 类的修饰符
  • 类实现的所有接口
  • 类的构造函数
  • 类的所有字段
  • 类的所有方法

获取类的名字

类的名字分为简称和全称,比如下面的类其简称为Person,全称为com.Person

package com;
public class Person{
   }

通过反射获取类的名称方法如下:

Class clazz = ...;
String simpleName = clazz.getSimpleName();
String fullQualifiedName = clazz.getName();

获取类的修饰符

通过Class对象的getModifiers方法获取类的修饰符,此方法返回的是一个整数,然后依赖Modifier类的一系列方法来分析getModifiers方法返回整数的含义.

int modifier = clazz.getModifiers();
boolean isPublic = Modifier.isPublic(modifier);
boolean isAbs = Modifier.isAbstract(modifier);

获取包的信息

可以通过Class对象对的getPackage()方法获取类的包信息,此方法返回的是Package类型,通过此Package类型就可以得到包的名字,比如:

Package pkg = clazz.getPackage();
String pkgName = pkg.getName();

获取父类信息

获取父类信息主要是靠getSuperClass()方法实现,如果当前的Class对象代表的是Object类型,接口类型,void类型,基本类型,那么此方法返回null值

Class<?> superClazz = clazz.getSuperclass();
String superClassName = superClazz.getSimpleName();

获取实现的接口(此方法需要遍历)

可以通过getInterfaces方法获取实现或继承的接口信息.如果当前的Class对象代表的是一个类,那么此方法得到是此类声明实现的所有接口信息,不包含其父类实现的接口信息.返回的数组中按声明的顺序排序.如果没有实现接口就返回长度为0的数组.

如果当前的Class对象代表的是一个接口,那么此方法返回的是此接口extends的所有接口信息,返回的数组中按照声明的接口顺序排序.如果没有继承任何接口,返回的数组是一个长度为0的数组.

如果当前的Class对象代表的是void或者基本类型,此方法返回长度为0的数组.

如果当前的Class对象代表的是数组类型,那么返回的是CloneableSerializable


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值