创建运行时类的对象、调用运行时类的指定结构以及获取运行时类的完整结构

2023-05-16

创建两个类、一个注解、一个接口、用来准备测试

public class Creature<T> implements Serializable {
    private char gender;
    public double weight;

    private void breath(){
        System.out.println("生物呼吸");
    }

    public void eat(){
        System.out.println("生物吃东西");
    }

}
@MyAnnotation(value="hi")
public class Person extends Creature<String> implements Comparable<String>,MyInterface{

    private String name;
    int age;
    public int id;

    public Person(){}

    @MyAnnotation(value="abc")
    private Person(String name){
        this.name = name;
    }

     Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    @MyAnnotation
    private String show(String nation){
        System.out.println("我的国籍是:" + nation);
        return nation;
    }

    public String display(String interests,int age) throws NullPointerException,ClassCastException{
        return interests + age;
    }
    
    @Override
    public void info() {
        System.out.println("我是一个人");
    }

    @Override
    public int compareTo(String o) {
        return 0;
    }

    private static void showDesc(){
        System.out.println("我是一个可爱的人");
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }
}
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "hello";
}
public interface MyInterface {
    void info();
}

创建运行时类的对象以及调用指定结构

创建运行时类的对象

public class ReflectionTest {

    @Test
    public void testField() throws Exception {
        Class clazz = Person.class;

        //创建运行时类的对象
        Person p = (Person) clazz.newInstance();

        //获取指定的属性:要求运行时类中属性声明为public
        //通常不采用此方法
        Field id = clazz.getField("id");

        /*
        设置当前属性的值
        set():参数1:指明设置哪个对象的属性   参数2:将此属性值设置为多少
         */

        id.set(p,1001);

        /*
        获取当前属性的值
        get():参数1:获取哪个对象的当前属性值
         */
        int pId = (int) id.get(p);
        System.out.println(pId);
    }

操作运行时类中指定属性

    @Test
    public void testField1() throws Exception {
        Class clazz = Person.class;

        //创建运行时类的对象
        Person p = (Person) clazz.newInstance();

        //1. getDeclaredField(String fieldName):获取运行时类中指定变量名的属性
        Field name = clazz.getDeclaredField("name");

        //2.保证当前属性是可访问的
        name.setAccessible(true);
        //3.获取、设置指定对象的此属性值
        name.set(p,"Tom");

        System.out.println(name.get(p));
    }

操作运行时类中指定方法

    @Test
    public void testMethod() throws Exception {

        Class clazz = Person.class;

        //创建运行时类的对象
        Person p = (Person) clazz.newInstance();

        /*
        1.获取指定的某个方法
        getDeclaredMethod():参数1 :指明获取的方法的名称  参数2:指明获取的方法的形参列表
         */
        Method show = clazz.getDeclaredMethod("show", String.class);
        //2.保证当前方法是可访问的
        show.setAccessible(true);

        /*
        3. 调用方法的invoke():参数1:方法的调用者  参数2:给方法形参赋值的实参
        invoke()的返回值即为对应类中调用的方法的返回值。
         */
        Object returnValue = show.invoke(p,"CHN"); //String nation = p.show("CHN");
        System.out.println(returnValue);

        System.out.println("*************调用静态方法**************");

        // private static void showDesc()

        Method showDesc = clazz.getDeclaredMethod("showDesc");
        showDesc.setAccessible(true);
        //如果调用的运行时类中的方法没有返回值,则此invoke()返回null
//        Object returnVal = showDesc.invoke(null);
        Object returnVal = showDesc.invoke(Person.class);
        System.out.println(returnVal);//null

    }

调用运行时类中的指定构造器

    @Test
    public void testConstructor() throws Exception {
        Class clazz = Person.class;

        //private Person(String name)
        /*
        1.获取指定的构造器
        getDeclaredConstructor():参数:指明构造器的参数列表
         */

        Constructor constructor = clazz.getDeclaredConstructor(String.class);

        //2.保证此构造器是可访问的
        constructor.setAccessible(true);

        //3.调用此构造器创建运行时类的对象
        Person per = (Person) constructor.newInstance("Tom");
        System.out.println(per);

    }
}

获取运行时类的完整结构

获取运行时类的属性结构

public class FieldTest {

    @Test
    public void test1(){

        Class clazz = Person.class;

        //获取属性结构
        //getFields():获取当前运行时类及其父类中声明为public访问权限的属性
        Field[] fields = clazz.getFields();
        for(Field f : fields){
            System.out.println(f);
        }
        System.out.println();

        //getDeclaredFields():获取当前运行时类中声明的所有属性。(不包含父类中声明的属性)
        Field[] declaredFields = clazz.getDeclaredFields();
        for(Field f : declaredFields){
            System.out.println(f);
        }
    }

    //权限修饰符  数据类型 变量名
    @Test
    public void test2(){
        Class clazz = Person.class;
        Field[] declaredFields = clazz.getDeclaredFields();
        for(Field f : declaredFields){
            //1.权限修饰符
            int modifier = f.getModifiers();
            System.out.print(Modifier.toString(modifier) + "\t");

            //2.数据类型
            Class type = f.getType();
            System.out.print(type.getName() + "\t");

            //3.变量名
            String fName = f.getName();
            System.out.print(fName);

            System.out.println();
        }
    }
}

获取运行时类的方法结构

public class MethodTest {

    @Test
    public void test1(){

        Class clazz = Person.class;

        //getMethods():获取当前运行时类及其所有父类中声明为public权限的方法
        Method[] methods = clazz.getMethods();
        for(Method m : methods){
            System.out.println(m);
        }
        System.out.println();
        //getDeclaredMethods():获取当前运行时类中声明的所有方法。(不包含父类中声明的方法)
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for(Method m : declaredMethods){
            System.out.println(m);
        }
    }

    /*
    @Xxxx
    权限修饰符  返回值类型  方法名(参数类型1 形参名1,...) throws XxxException{}
     */
    @Test
    public void test2(){
        Class clazz = Person.class;
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for(Method m : declaredMethods){
            //1.获取方法声明的注解
            Annotation[] annos = m.getAnnotations();
            for(Annotation a : annos){
                System.out.println(a);
            }

            //2.权限修饰符
            System.out.print(Modifier.toString(m.getModifiers()) + "\t");

            //3.返回值类型
            System.out.print(m.getReturnType().getName() + "\t");

            //4.方法名
            System.out.print(m.getName());
            System.out.print("(");
            //5.形参列表
            Class[] parameterTypes = m.getParameterTypes();
            if(!(parameterTypes == null && parameterTypes.length == 0)){
                for(int i = 0;i < parameterTypes.length;i++){

                    if(i == parameterTypes.length - 1){
                        System.out.print(parameterTypes[i].getName() + " args_" + i);
                        break;
                    }

                    System.out.print(parameterTypes[i].getName() + " args_" + i + ",");
                }
            }

            System.out.print(")");

            //6.抛出的异常
            Class[] exceptionTypes = m.getExceptionTypes();
            if(exceptionTypes.length > 0){
                System.out.print("throws ");
                for(int i = 0;i < exceptionTypes.length;i++){
                    if(i == exceptionTypes.length - 1){
                        System.out.print(exceptionTypes[i].getName());
                        break;
                    }

                    System.out.print(exceptionTypes[i].getName() + ",");
                }
            }
            System.out.println();
        }
    }
}

获取运行时类的其他结构

获取构造器结构

    @Test
    public void test1(){

        Class clazz = Person.class;
        //getConstructors():获取当前运行时类中声明为public的构造器
        Constructor[] constructors = clazz.getConstructors();
        for(Constructor c : constructors){
            System.out.println(c);
        }

        System.out.println();
        //getDeclaredConstructors():获取当前运行时类中声明的所有的构造器
        Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
        for(Constructor c : declaredConstructors){
            System.out.println(c);
        }
    }

获取运行时类的父类

    @Test
    public void test2(){
        Class clazz = Person.class;

        Class superclass = clazz.getSuperclass();
        System.out.println(superclass);
    }

获取运行时类的带泛型的父类

    @Test
    public void test3(){
        Class clazz = Person.class;

        Type genericSuperclass = clazz.getGenericSuperclass();
        System.out.println(genericSuperclass);
    }

获取运行时类的带泛型的父类的泛型

    @Test
    public void test4(){
        Class clazz = Person.class;

        Type genericSuperclass = clazz.getGenericSuperclass();
        ParameterizedType paramType = (ParameterizedType) genericSuperclass;
        //获取泛型类型
        Type[] actualTypeArguments = paramType.getActualTypeArguments();
//        System.out.println(actualTypeArguments[0].getTypeName());
        System.out.println(((Class)actualTypeArguments[0]).getName());
    }

获取运行时类实现的接口

    @Test
    public void test5(){
        Class clazz = Person.class;

        Class[] interfaces = clazz.getInterfaces();
        for(Class c : interfaces){
            System.out.println(c);
        }

        System.out.println();
        //获取运行时类的父类实现的接口
        Class[] interfaces1 = clazz.getSuperclass().getInterfaces();
        for(Class c : interfaces1){
            System.out.println(c);
        }
    }

获取运行时类所在的包

    @Test
    public void test6(){
        Class clazz = Person.class;

        Package pack = clazz.getPackage();
        System.out.println(pack);
    }

获取运行时类声明的注解

    @Test
    public void test7(){
        Class clazz = Person.class;

        Annotation[] annotations = clazz.getAnnotations();
        for(Annotation annos : annotations){
            System.out.println(annos);
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建运行时类的对象、调用运行时类的指定结构以及获取运行时类的完整结构 的相关文章

  • ShardingSphere-JDBC水平分片

    项目中可以使用ShardingSphere JDBC将数据存到不同库的表中 一 准备服务器 服务器规划 xff1a 使用docker方式创建如下容器 主服务器 xff1a 容器名server order0 xff0c 端口3310从服务器
  • ShardingSphere-JDBC绑定表

    一 什么是绑定表 指分片规则一致的一组分片表 使用绑定表进行多表关联查询时 xff0c 必须使用分片键进行关联 xff0c 否则会出现笛卡尔积关联或跨库关联 xff0c 从而影响查询效率 例如 xff1a t order 表和 t orde
  • ShardingSphere-JDBC广播表

    一 什么是广播表 指所有的分片数据源中都存在的表 xff0c 表结构及其数据在每个数据库中均完全一致 适用于数据量不大且需要与海量数据的表进行关联查询的场景 xff0c 例如 xff1a 字典表 广播具有以下特性 xff1a xff08 1
  • 01_JUC概述

    1 JUC是什么 xff1f 在 Java 5 0 提供了 java util concurrent 简称JUC 包 xff0c 在此包中增加了在并发编程中很常用的工具类 此包包括了几个小的 已标准化的可扩展框架 xff0c 并提供一些功能
  • 02_Lock锁

    首先看一下JUC的重磅武器 锁 xff08 Lock xff09 相比同步锁 xff0c JUC包中的Lock锁的功能更加强大 xff0c 它提供了各种各样的锁 xff08 公平锁 xff0c 非公平锁 xff0c 共享锁 xff0c 独占
  • 03_线程间通信

    面试题 xff1a 两个线程打印 两个线程 xff0c 一个线程打印1 52 xff0c 另一个打印字母A Z打印顺序为12A34B 5152Z xff0c 要求用线程间通信 public class Demo01 public stati
  • 04_并发容器类

    1 重现线程不安全 xff1a List 首先以List作为演示对象 xff0c 创建多个线程对List接口的常用实现类ArrayList进行add操作 public class NotSafeDemo public static void
  • Java笔记(10)——异常处理

    1 Java异常 Java运行时发生异常可以分为两类 xff1a Error xff1a JVM系统内部错误 资源耗尽等问题产生的异常 Exception xff1a 编程错误或偶然的外在因素导致的 2 常见的异常 2 1 RuntimeE
  • mariadb 数据库连接使用

    今天测试了使用mariadb的使用 xff0c 我使用的springboot 43 mariadb 来操作数据库 xff0c 和以前的代码基本一样 xff0c 就数据变成了mariadb xff0c 驱动还是使用mysql的 pom 文件如
  • 05_JUC强大的辅助类

    JUC的多线程辅助类非常多 xff0c 这里我们介绍三个 xff1a CountDownLatch xff08 倒计数器 xff09 CyclicBarrier xff08 循环栅栏 xff09 Semaphore xff08 信号量 xf
  • 06_Callable接口

    Thread 类 Runnable 接口使得多线程编程简单直接 但Thread类和Runnable接口都不允许声明检查型异常 xff0c 也不能定义返回值 没有返回值这点稍微有点麻烦 不能声明抛出检查型异常则更麻烦一些 public voi
  • 07_阻塞队列(BlockingQueue)

    目录 1 什么是BlockingQueue 2 认识BlockingQueue 3 代码演示 栈与队列概念 栈 Stack xff1a 先进后出 xff0c 后进先出 队列 xff1a 先进先出 1 什么是BlockingQueue 在多线
  • 08_ThreadPool线程池

    1 架构说明 Java中的线程池是通过Executor框架实现的 xff0c 该框架中用到了Executor xff0c ExecutorService xff0c ThreadPoolExecutor这几个类 Executor接口是顶层接
  • Docker 安装 elasticsearch、kibana、ik

    一 安装elasticsearch 1 拉取 elasticsearch 镜像 docker pull elasticsearch 7 6 2 2 创建 elasticsearch 容器 docker run name elasticsea
  • ElasticSearch 中 FieldType 详解

    date float long都是不能够被拆分的 64 Field type 61 FieldType Text analyzer 61 34 ik max word 34 表示该字段是一个文本 xff0c 并作最大程度拆分 xff0c 默
  • SpringBoot 使用 ElasticSearch 编程测试

    1 在 pom xml 准备依赖 lt dependency gt lt groupId gt org projectlombok lt groupId gt lt artifactId gt lombok lt artifactId gt
  • el-table-column中formatter格式化字典

    el table column中formatter格式化字典 vue 中使用 lt el table column gt 中的 formatter 格式化内容 x1f52e lt template gt lt 列表 gt lt el tab
  • cookie和session详解

    源自 xff1a https www cnblogs com l199616j p 11195667 html xff0c 有删减 另 xff0c cookie session与token的真正区别 xff1a https blog csd
  • 如何理解端到端

    1 非端到端 xff1a 典型的自然语言处理 xff08 Natural Language Processing xff09 过程 xff1a 分词 gt 词性标注 gt 句法分析 gt 语义分析 直至得出结果 多个独立步骤 xff0c 每
  • Java笔记(11)——Collection集合

    0 先创建一个Person类为例 span class token keyword public span span class token keyword class span span class token class name Pe

随机推荐

  • 笔记:QGC使用及姿态环仿真调节方式

    笔记 xff1a QGC使用及姿态环仿真调节方式 打开Gazebo及QGC 进入终端管理员权限 sudo s 在终端打开Gazebo cd Firmware make px4 sitl default gazebo 点击文件夹中的QGC x
  • springboot集成freemarker模板,项目打成jar包到生产环境显示找不到模板文件

    文章目录 一 问题描述二 原始代码三 解决方案四 注意点 一 问题描述 1 使用springboot集成freemarker模版后 xff0c 在本地运行正常 xff1b 打成jar包后到线上测试报如下错误 xff1a 2 原因 xff1a
  • Linux网络设置

    文章目录 引言一 查看网络配置1 查看网络接口信息ifconfig2 修改网络配置文件3 设置网络接口参数 二 主机名称配置文件hostname1 hostname命令2 三种修改主机名的方式2 1 临时修改主机名 xff08 hostna
  • Java中的集合类

    Java中所有的类都位于java util包下 xff0c 主要由两个接口派生出来 分别是Collection xff08 集合 xff09 和Map Collection xff08 映射集合 xff09 xff0c 包含了List和Se
  • 退出VM VirtualBox独占的键盘和鼠标

    今天无意之间点了菜单栏的 热键 鼠标集成 xff0c 结果鼠标被锁在了里面出不来 xff0c 试了好多方法都不行 xff0c 有点奔溃 xff0c 最后发现 右边的Alt 43 Ctrl组合键可以跳出
  • Linux - 第11节 - 网络入门

    目录 1 计算机网络背景 1 1 网络发展 1 2 认识 34 协议 34 2 网络协议初识 2 1 协议分层 2 2 OSI七层模型 2 3 TCP IP五层 xff08 或四层 xff09 模型 3 网络传输基本流程 3 1 同局域网的
  • @PathVariable注解的用法和作用

    64 PathVariable注解的用法和作用 64 PathVariable 映射 URL 绑定的占位符 通过 64 PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中 URL 中的 xxx 占位符可以通过
  • 最新虚拟机中Ubuntu18.04安装教程(傻瓜教程)

    1 文件和软件下载 下载Ubuntu18 04文件 可以直接点下方的链接下载 Ubuntu18 04安装链接 下载VMware Workstation 笔者这边使用的是VMware Workstation15 5pro xff0c 大家也可
  • optimizer优化器详解

    在机器学习中 xff0c 优化器 xff08 optimizer xff09 是一种用于更新模型参数以最小化训练误差的算法 它可以将损失函数的梯度作为输入 xff0c 并根据该梯度调整模型参数的值 常见的优化器算法包括随机梯度下降 xff0
  • Java创建多线程的四种方式

    一 继承Thread类 1 创建一个继承于Thread类的子类 2 重写Thread类的run gt 将此线程执行的操作声明在run 中 3 创建Thread类的子类的对象 4 通过此对象调用start 启动当前线程 调用当前线程的run
  • MySQL基础

    本单元目标 一 为什么要学习数据库 二 数据库的相关概念 DBMS DB SQL 三 数据库存储数据的特点 四 初始MySQL MySQL产品的介绍 MySQL产品的安装 MySQL服务的启动和停止 MySQL服务的登录和退出 MySQL的
  • Thread类中的常用方法

    Thread类中的常用方法 xff08 学习总结 xff09 xff1a 序号函数作用1start 启动当前线程 xff1b 调用当前线程的run 2run 通常需要重写Thread类中的此方法 xff0c 将创建的线程要执行的操作生命在此
  • 线程的同步机制

    方式一 xff1a 同步代码块 span class token keyword synchronized span span class token punctuation span 同步监视器 span class token punc
  • Java常用类总结

    一 字符串相关的类 String类及其常用方法 1 String声明为final的 xff0c 不可被继承 2 String实现了Serializable接口 xff1a 表示字符串是支持序列化的 xff1b 实现了Comparable接口
  • java获取两个字符串中最大相同字串

    span class token keyword import span span class token keyword static span java span class token punctuation span lang sp
  • jdk提供的4种注解

    元注解 xff1a 对现有的注解进行解释说明的注解 Retention xff1a 指定所修饰的Annotation的生命周期 xff1a SOURCE CLASS xff08 默认行为 xff09 RUNTIME xff0c 只有声明为R
  • Java中List接口常用方法

    List除了从Collection集合继承的方法外 xff0c List集合里添加了一些根据索引来操作集合元素的方法 xff1a 序号返回值函数作用1voidadd int index Object ele 在index位置插入ele元素2
  • 对Java中Class类的理解并获取Class实例

    关于java lang Class类的理解 类的加载过程 xff1a 程序经过javac exe命令以后 xff0c 会生成一个或多个字节码文件 class结尾 接着我们使用java exe命令对某个字节码文件进行解释运行 相当于将某个字节
  • 类加载器ClassLoader及应用

    类加载器ClassLoader span class token keyword public span span class token keyword class span span class token class name Cla
  • 创建运行时类的对象、调用运行时类的指定结构以及获取运行时类的完整结构

    创建两个类 一个注解 一个接口 用来准备测试 span class token keyword public span span class token keyword class span span class token class n