首页 > 其他分享 >反射及其应用---->1

反射及其应用---->1

时间:2024-09-29 09:22:00浏览次数:11  
标签:反射 获得 getName System ---- 应用 println Class out

目录

1.反射的定义

2.反射的应用

2.1 获得Class对象

2.2 获得类对象

获得类的基本信息


1.反射的定义

  • 程序可以访问、检测和修改它本身状态或行为的一种能力

  • 在程序运行时,可以通过反射了解类的信息 和 使用类

    • 了解类的哪些信息呢?

      • 类的基本信息(类名,修饰符,实现接口,继承的父类,所属的包,使用的注解)

      • 类的构造方法信息 (修饰符,方法名,参数列表,异常声明,注意:没有方法体)

      • 类的属性信息(修饰符,属性类型,属性名)

      • 类的普通方法信息(修饰符,返回类型,方法名,参数列表,异常声明,注意:没有方法体)

    • 如何实用类?

      • 创建对象

      • 调用对象的方法

      • 调用对象的属性

    • 为什么要通过反射了解类信息,要操作类对象?

      • 做封装工具或框架时,会使用的放射

      • 封装中有一部分功能时固定的,有一部分功能需要按照使用者的需求来实现

      • 使用者如何将我们的需求告诉框架,从而让框架按照我们的需求来完成操作

        1. 传参

        2. 配置(文件)

        3. 约定大于配置

      • 如果不同的使用者,有不同的类操作需求,就会应用到反射了。

2.反射的应用

与反射相关的类一般都在 java.lang.reflect包中

2.1 获得Class对象

  • Class对象是反射应用的基石,必须要先获得Class对象,才能完成后续的反射操作

  • 在JVM加载类信息时,会经过一系列的处理,最终将类信息存在方法区,并且为之生成一个Class对象,作用方法区类信息的访问入口

  • 将Class对象理解成类模板

  • 如何获得Class对象? 有三种方式

    1. Class c ="类名".getClass()

      getClass是Object类的方法

    2. Class c = String.class ;

    3. Class c = Class.forName("java.lang.String");

2.2 获得类对象

获得类的基本信息

  • Class可以代表类或接口

  • 提供了一些方法可以获得类的基本信息

c.getName();//获得类长名
c.getSimpleName();//获得类短名
c.getModifiers();//获得修饰符组合的数字和
				 //Modifier.toString( c.getModifiers() ) 获得修饰符关键字
c.getSuperClass();//获得父类
c.getInterfaces();//获得接口数组
c.getPackage();//获得包对象
			   //package.getName() 获得包名
public static void main(String[] args) {
    Class<A> c = A.class;

    System.out.println(c.getName()); //获得类长名(带包路径)
    System.out.println(c.getSimpleName()); //获得类短名

    //访问权限也算修饰符
    //该方法获得的是修饰符组合的数字和
    System.out.println(Modifier.toString(c.getModifiers()));

    Class sc = c.getSuperclass();
    System.out.println(sc.getName()); //java.lang.Object

    Class<?>[] ics = c.getInterfaces();
    for(Class ic : ics){
        System.out.println(ic.getName());//序列化,克隆
    }

    Package p = c.getPackage();
    System.out.println(p.getName());
}

获得属性信息

类的属性信息,都是用Field对象表示

c.getFields();//获得所有属性对象(公共的,从父类继承的)
c.getField(name);//获得指定名字的属性对象
c.getDeclaredFields();//获得本类所有权限的属性对象
c.getDeclaredField(name);
field.getName();//获得属性名
field.getModifiers();//获得属性修饰符
field.getType();//获得属性类型
public static void main(String[] args) throws NoSuchFieldException {
    Class c = A.class ;

    //获得指定名字的属性
    //与getFields方法一同,只能获得public的属性,可以是自己的也可以是继承来的
    Field field = c.getField("n");
    System.out.println(field.getName());
    System.out.println(field.getType());
    System.out.println(Modifier.toString( field.getModifiers() ));

    System.out.println("--------------------------------");
    Field[] fields = c.getFields();
    for(Field f : fields){
        System.out.println(f.getName());
        System.out.println(f.getType());
        System.out.println(Modifier.toString( f.getModifiers() ));
    }

    System.out.println("--------------------------------");

    //与getDeclaredField()一同,可以获得当前类的所有权限的属性,但不能获得继承属性
    fields = c.getDeclaredFields() ;
    for(Field f : fields){
        System.out.println(f.getName());
        System.out.println(f.getType());
        System.out.println(Modifier.toString( f.getModifiers() ));
    }

}

获得方法信息

c.getMethods(); //获得所有的public方法,可以继承的
c.getDeclaredMethods();//获得本类所有权限的方法
c.getMethod(name,Class...paramTypes) ;//根据指定的方法名和参数列表类型获得只当的方法
									  //c.getMethod("t1");   			t1()
									  //c.getMethod("t1",int.class);	t1(int)
									  //c.getMethod("t1",int.class,String.class) t1(i,s)
c.getDeclaredMethod(name , Class...pts) ;
method.getName();//获得方法名
method.getModifiers();
method.getReturnType();//获得返回类型
method.getParameterCount();//获得参数数量
method.getParameterTypes();//获得参数列表类型 返回Class[]
method.getParameters();//获得参数列表对象 返回Parameter[]
					   //parameter.getName();获得参数名
					   //parameter.getType();获得参数类型
					   //parameter.getModifiers();获得参数修饰符
method.getExceptionTypes();//获得异常声明列表
public static void main(String[] args) throws NoSuchMethodException {
    Class c = A.class ;

    //Method t1 = c.getMethod("t1",int.class);
    Method[] ts = c.getMethods() ;
    for(Method t1 : ts) {
        System.out.println(t1.getName()); //方法名
        System.out.println(t1.getReturnType()); //返回类型
        System.out.println(Modifier.toString(t1.getModifiers())); //修饰符
        Parameter[] parameters = t1.getParameters();
        System.out.println(parameters.length); //参数个数
        System.out.println(t1.getParameterCount());
        for (Parameter parameter : parameters) {
            System.out.println(parameter.getName());//参数名(*)
            System.out.println(parameter.getType());//参数类型
            System.out.println(Modifier.toString(parameter.getModifiers()));
        }
        Class<?>[] ets = t1.getExceptionTypes();
        System.out.println(ets.length);//异常个数
        for (Class e : ets) {
            System.out.println(e.getName());
        }
        System.out.println("-------------------------------------");
    }
}

获得构造方法信息

c.getConstructors();//获得所有公共的构造方法(本类和继承的)
c.getConstructor(Class...pts);//根据参数列表类型获得指定的构造方法
c.getDeclaredConstructors();
c.getDeclaredConstructor(Class...pts);
constructor.getName();//获得方法名
constructor.getModifiers();
constructor.getParameterCount();//获得参数数量
constructor.getParameterTypes();//获得参数列表类型 返回Class[]
constructor.getParameters();//获得参数列表对象 返回Parameter[]
					   //parameter.getName();获得参数名
					   //parameter.getType();获得参数类型
					   //parameter.getModifiers();获得参数修饰符
constructor.getExceptionTypes();//获得异常声明列表

标签:反射,获得,getName,System,----,应用,println,Class,out
From: https://blog.csdn.net/lzp122390/article/details/142626773

相关文章

  • 反射及其应用---->2
    目录1.使用类对象1.1创建对象1.2使用对象属性1.3使用方法2.反射操作数组3.反射获得泛型4.类加载器4.1双亲委派机制4.2自定义加载器1.使用类对象通过反射使用类对象,主要体现3个部分创建对象,调用方法,调用属性(存值,取值)1.1创建对象利用反射创建对象有两种方式......
  • 【含文档+PPT+源码】基于SpringBoot的体育馆管理系统的设计与实现
    项目背景与意义近年来,随着人们生活水平的提高和健康意识的增强,体育馆作为提供体育锻炼和休闲娱乐的重要场所,其使用频率和管理难度也在不断增加。传统的体育馆管理模式通常依赖于人工记录和手动操作,不仅效率低下,而且容易出现错误和遗漏,难以适应现代社会的快节奏和高效率要求。......
  • 搜索:如何用 A*搜索算法实现游戏中的寻路功能?
    搜索:如何用A*搜索算法实现游戏中的寻路功能?在游戏开发中,寻路功能是一个非常重要的部分。它可以让游戏中的角色自动找到从一个位置到另一个位置的最佳路径。A搜索算法是一种常用的寻路算法,它可以在复杂的地图环境中快速找到最短路径。本文将详细介绍如何用A搜索算法实现游......
  • Java 冒泡排序 (Bubble Sort) ✨ 代码版 + Emoji讲解
    冒泡排序的基本思想就是让“大泡泡”不断往上浮,直到整个数组像泡泡浴一样排序好!......
  • 【含文档+PPT+源码】基于SpringCloud微服务的船舶交易平台的设计与实现
    项目背景与意义随着全球经济的快速发展,航运业成为国际贸易中不可或缺的一环。船舶交易平台作为航运业的重要组成部分,为船舶买卖、租赁等交易提供了便利和高效的途径。在传统的船舶交易中,买卖双方往往需要通过中介机构来进行交易,这不仅增加了交易的时间和成本,还存在信息不透明......
  • 算法实战:剖析 Redis 常用的数据类型对应的数据结构
    算法实战:剖析Redis常用的数据类型对应的数据结构Redis是一个非常流行的内存数据库,它提供了多种数据类型,每种数据类型都有其特定的数据结构支持。了解这些数据结构对于深入理解Redis的工作原理和优化使用非常重要。本文将剖析Redis常用的数据类型对应的数据结构,并通......
  • 网络编程-TCP
    网络通信基础1、网络通信的协议:TCP、UDP、IP2、网络通信模型:七层模型、四层模型3、网络通信理论:socket、IP、端口号、字节序4、网络IO模型:4种5、网络超时处理6、网络的广播、组播、单播网络通信的特征(局域网)不同设备在通信时,要求其IP地址必须处于同一网段网络通信协议......
  • AWVS漏洞扫描工具(扫描pikachu)
    1.首先进来输入扫描的网址ip2.来到这里啥也不改下一步3.选则全面新的报告4.开始扫描5.等它扫完就点击reports查看报告然后到处就欧克了......
  • javaweb基于SSH开发小型学生宿舍管理系统源码+报告 课程设计 大作业
    ......
  • 解决DHCP服务异常导致设备无法获取IP地址的方法
    DHCP在网络环境中会自动为网络中的设备分配IP地址和其他关键网络参数,可以简化网络配置过程。但是,如果DHCP服务出现异常时,设备可能无法正常获取IP地址,会影响到网络通信。本文讲述一些办法可以有效解决DHCP服务异常导致设备无法获取IP地址的问题。首先我们要先搞清楚DHCP服务......