Reflect反射的基础知识

写个父类:

package reflectgetclass;

public class Person {
    String name;
    public Person(){}
    public Person(String name){
        this.name= name;
    }
}

写个子类:

package reflectgetclass;

public class Student extends Person implements Runnable,Comparable {

    private int classId ;
    private String name;
    private double score;

    public Student(){}
    public Student(int classId){
        this.classId = classId;
    }
    public Student(String name,double score){
        this.name = name;
        this.score = score;
    }

    public void m1(){
        System.out.println("this is the first method");
    }

    public void m1(String s,double d){
        System.out.println(s+"学生的成绩是"+d);
    }
    public int m2(){
        return this.classId;
    }
    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
    }   
}

利用反射获得该子类中的属性,方法,构造,父类及接口:

package reflectgetclass;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
 * 通过反射获得类的内容(属性、方法、构造、父类、实现的接口)
 * @author 流马
 *
 */
public class ReflectGetClass {

    public static void main(String[] args) throws Exception {
        Class c = Class.forName("reflectgetclass.Student");//得到类
        StringBuffer sb = new StringBuffer();//常见可变长存储的StringBuffer sb

        sb.append(Modifier.toString(c.getModifiers())+" class ");
        sb.append(c.getName()+"{\n");
        //得到属性内容
        Field[] fields = c.getDeclaredFields();
        for(Field f : fields){
            sb.append("\t"+Modifier.toString(f.getModifiers())+" "+f.getType().getName()+" "+f.getName()+"\n");
        }
        //得到构造
        Constructor[] cs = c.getDeclaredConstructors();
        for(Constructor con : cs){
            sb.append("\t"+Modifier.toString(con.getModifiers())+" "+c.getName()+"(");
            //得到构造中的参数列表
            Class[] classes = con.getParameterTypes();
            for(Class cla: classes){
                if(cla!=classes[classes.length-1]){
                    sb.append(cla.getName()+",");
                }else{
                    sb.append(cla.getName());
                }
            }
            sb.append("){}");
            sb.append("\n");
        }
        //得到方法
        Method[] methods = c.getDeclaredMethods();
        for(Method me: methods){
            sb.append(Modifier.toString(me.getModifiers())+" "+me.getReturnType().getName()+" "+me.getName()+"(");
            //得到方法的参数类型
            Class[] css = me.getParameterTypes();
            for(Class ca : css){
                if(ca!=css[css.length-1]){
                    sb.append(ca.getName()+",");
                }else{
                    sb.append(ca.getName());
                }
            }
            sb.append("){}");
            sb.append("\n");
        }
        sb.append("}");
        //得到父类
        Class parentClass = c.getSuperclass();
        //得到实现的接口
        Class[] interfaces = c.getInterfaces();
        for(Class it : interfaces){
            sb.append("\n"+it.getName()+"\n");
        }
        System.out.println(sb);//打印出SringBuffer里面的内容
    }
}

运行结果:
这里写图片描述

版权声明:本文为qq_38205058原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38205058/article/details/70943474

智能推荐

ActiveMQ学习4-ActiveMQ的安全机制和集群模式

ActiveMQ的安全机制和集群模式 20 ActiveMQ安全机制 20.1 Web 控制台安全 20.2 消息服务器Broker安全 21 ActiveMQ主从集群 21.1 使用集群的重要性 20.2 主从集群的方式 20.2.1 shared filesystem Master-Slave方式主从集群 20.2.2 shared database Master-Slave方式主从集群 20...

说说 Python Django 应用的基础目录结构

通过以下 django-admin 指令创建应用之后,就会生成应用的基础目录结构。 比如,我们建立了一个叫 ‘first’ 的应用,它的目录结构是这样的: 目录或文件 说明 最外层的 first/ 这是新应用的根目录,所有与该应用相关的内容都放在这里。 manage.py 用于管理 Django 项目的命令行工具。 里面一层的 first/ 目录 是一个...

Springboot整合rabbitMQ

依赖: 配置文件application.yml RabbitConfig 消息生产者RabbitProducer 消息消费者RabbitCustomer 通过Controller进行调用 启动项目后调用接口: 结果:...

Thread.join()方法的使用

如果一个线程A执行了thread.join()语句,代表当前线程A等待thread线程终止后才从thread.join()方法返回 并且这个方法具有超时特性,可以添加参数设置 输出结果: jdk中Thread.join()方法的源码(进行了部门调整)   每个线程终止的条件是前驱线程的终止,每个线程等待前驱线程终止后,才从join()方法返回,  当线程终止时,会调用自身的no...

linux服务器部署jenkins笔记

安装jenkins参考文档:https://blog.csdn.net/tomatocc/article/details/83930714 1. 打开jenkins官网:https://jenkins.io/download/ 将war包下载到本地 **ps:**这里要注意的是要下载左边下方的war包,不要下载右边下面的war包。左边是稳定版本,右边是最新版本,建议大家使用稳定版本(我刚开始下载的...

猜你喜欢

k8s部署elasticsearch集群

百度营销大学     环境准备 我们使用的k8s和ceph环境见: https://blog.51cto.com/leejia/2495558 https://blog.51cto.com/leejia/2499684 ECK简介 Elastic Cloud on Kubernetes,这是一款基于 Kubernetes Operator 模式的新型编排产品,用户可使用该产品在...

saas-export项目-AdminLTE介绍与入门

AdminLTE介绍 (1)AdminLTE是什么? AdminLTE是一款建立在bootstrap和jquery之上的开源的模板主题工具 (2)AdminLTE有什么特点? 提供一系列响应的、可重复使用的组件, 并内置了多个模板页面 自适应多种屏幕分辨率,兼容PC和移动端 快速的创建一个响应式的Html5网站 AdminLTE 不但美观, 而且可以免去写很大CSS与JS的工作量 AdminLTE...

MyBatis中ResultMap结果集映射

用于解决属性名和字段名不一致的情况: resultMap 元素是 MyBatis 中最重要最强大的元素。...

编写一个shell

编写shell的过程: 1.从标准输入中读入一个字符串。 2.解析字符串 3.创建一个子进程的执行程序。 4.子进程程序替换。 5.父进程等待子进程退出。...

WEB自动化测试中Xpath定位方法

前言: Xpath是在XML文档中查找信息的一种语言,使用路径表达式来选取XML文档中的节点或节点集,由于XML与HTML结构类似(前者用于传输数据,后者用于显示数据),所以Xpath也常用于查找HTML文档中的节点或节点集。 一  路径表达式: 路径以“/”开始     表示找到满足该绝对路径的元素; 路径以//”开始  ...