美文网首页
调用运行时类的结构

调用运行时类的结构

作者: DOB_8199 | 来源:发表于2021-02-22 17:16 被阅读0次

通过反射创建对应的运行时类的对象

    Class clazz = Person.class;

Person obj = clazz.newInstance();

    System.out.println(obj);

newInstance():调用此方法,创建对应的运行时类的对象。内部调用了运行时类的空参的构造器。

要想此方法正常的创建运行时类的对象,要求:

1.运行时类必须提供空参的构造器

2.空参的构造器的访问权限得够。通常,设置为public。

在javabean中要求提供一个public的空参构造器。原因:

1.便于通过反射,创建运行时类的对象

2.便于子类继承此运行时类时,默认调用super()时,保证父类有此构造器

获取属性结构

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);}

权限修饰符 数据类型 变量名

    public void test2(){

    Class clazz = Person.class;

        Field[] declaredFields = clazz.getDeclaredFields();

        for(Field f : declaredFields){

权限修饰符

            int modifier = f.getModifiers();

            System.out.print(Modifier.toString(modifier) +"\t");

数据类型

            Class type = f.getType();

            System.out.print(type.getName() +"\t");

变量名

            String fName = f.getName();

            System.out.print(fName);

            System.out.println();}}}

获取运行时类的方法结构

    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{}

    lic void test2(){

        Class clazz = Person.class;

        Method[] declaredMethods = clazz.getDeclaredMethods();

        for(Method m : declaredMethods){

获取方法声明的注解

            Annotation[] annos = m.getAnnotations();

            for(Annotation a : annos){

                System.out.println(a);}

权限修饰符

            System.out.print(Modifier.toString(m.getModifiers()) +"\t");

返回值类型

            System.out.print(m.getReturnType().getName() +"\t");

方法名

            System.out.print(m.getName());

            System.out.print("(");

形参列表

            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(")");

抛出的异常

            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();}}

获取构造器结构

    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);}}

获取运行时类的信息

获取运行时类的父类

    public void test2(){

        Class clazz = Person.class;

        Class superclass = clazz.getSuperclass();

        System.out.println(superclass);}

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

    public void test3(){

        Class clazz = Person.class;

        Type genericSuperclass = clazz.getGenericSuperclass();

        System.out.println(genericSuperclass);}

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

eg. 获取 public class StudentDAO extends DAO<student> 中的<student>

    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());}

获取运行时类实现的接口

    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);}}

获取运行时类所在的包

    public void test6(){

        Class clazz = Person.class;

        Package pack = clazz.getPackage();

        System.out.println(pack);}

获取运行时类声明的注解

    public void test7(){

        Class clazz = Person.class;

        Annotation[] annotations = clazz.getAnnotations();

        for(Annotation annos : annotations){

            System.out.println(annos);}}

相关文章

  • Java反射 使用

    调用运行时类的指定结构 调用指定属性 调用指定的方法 创建运行时类对象 使用newInstance()来创建对象,...

  • 调用运行时类的结构

    通过反射创建对应的运行时类的对象 Class clazz = Person.class; Person obj =...

  • iOS中元类和类

    元类和类的数据结构是同一个,只是运行时使用的字段不一样。 实例方法调用是通过objc_msgSend来调用,它的第...

  • 虚拟机的方法调用和字节码执行

    目录 一、运行时栈帧结构二、方法调用三、方法执行 一、运行时栈帧结构 栈帧是用于支持虚拟机进行 方法调用 和 方法...

  • C++运行时的动态绑定

    1、Felid类 2、cat类 3、tiger类 4、ocelot类 5、运行时的调用 6、结果输出

  • Java反射

    定义 Java语言中一种动态(运行时)访问、检测、修改它本身的能力。 作用 动态的获取类的完整结构信息,调用对象的...

  • 【iOS】initialize 和 load 方法

    类编译后,相关的数据结构会保留在目标文件中,在运行时得到解析和使用(类的加载和初始化)。在运行期提前并且自动调用这...

  • Java中反射的使用详解

    1. 简介 反射可以动态获取类的完整结构信息,调用对象的方法。 优点:灵活性高,只有在运行时才动态创建对象实例 缺...

  • 反射的一些常规操作及简单的自定义注解

    获得Class类的四种方式1.调用运行时类本身的.class属性 2.通过运行时类的对象获取 3..通过Class...

  • 运行时的简略介绍

    获得类(包括范畴类)或者协议类中的属性和变量列表 事例 查看所有的方法的返回值和参数类型 运行时调用方法 运行时解...

网友评论

      本文标题:调用运行时类的结构

      本文链接:https://www.haomeiwen.com/subject/kvtcfltx.html