java反射怎么获取结构体_java反射-使用反射获取类的所有信息

在OOP(面向对象)语言中,最重要的一个概念就是:万事万物皆对象。

在java中,类也是一个对象,是java.lang.Class的实例对象,官网称该对象为类的类类型。

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

一个类的类类型有三种表示方式:

1.ClassName.class:类名.class,这种方式ying隐式的说明了任何一个类都有一个静态成员变量class。

2.obj.getClass():通过实例对象.getClass()来获取该类的类类型。

3.Class.forName("xxx"):xxx表示类的全称,该方式代表动态加载类。

既然有了动态加载类,辣么肯定有静态加载类,辣么这两种是什么意思呢?

动态加载类:jvm运行时刻加载类。

静态加载类:编译时刻加载类,表示在编译时刻就需要加载所有的可能使用到的类。

简单举个栗子:使用new创建一个对象,我们在运行程序的时候,该对象的类必须存在,否则会产生编译错误,这种方式就是静态加载类。如果使用了Object obj = Class.forName("xxx")来创建实例,只有在运行时候,该类不存在时,才会抛出异常,这种方式就是动态加载类。

使用动态加载类,可以根据优雅的设计我们的代码,比如:

// 接口 A ,存在方法 print

//ClassB 实现了接口 A//ClassC 实现了接口 A//ClassD 实现了接口 A//通过动态加载,根据传入的类全称不同,创建不同的实例对象。调用方法 a,这执行对应实例的代码块

A a = Class.forName(classPakeage);

a.print();

下面我使用代码来获取一个类的基本信息:

import java.lang.annotation.Annotation;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;/**

* java反射 工具类*/

public classClassUtil {/**

* 获取 obj 对象的所有信息,并打印 obj 类

* 该方法中,getXXXXs()方法都表示获取此对象所有 public 类型

* 对应的方法getDeclaredXXXs()方法表示获取该对象实现的所有对象(万事万物皆对象),不论访问权限

* @param obj*/

public static voidgetClassMsg(Object obj){//1.获取obj类的类类型

Class c =obj.getClass();//2.获取类 pageage

Package pa =c.getPackage();

System.out.println(pa.getName());//3.获取类注解

Annotation[] annotations =c.getAnnotations();for(Annotation annotation : annotations){

System.out.println(annotation.toString());

}

System.out.print(c.getName() + " ");//4.获取类的父类

Class superClass =c.getSuperclass();if(superClass != null){

System.out.print("extends" +superClass.getName());

}//5.获取类实现的接口

Class[] interfaces =c.getInterfaces();if(interfaces.length != 0){

System.out.print("implements");

Class iface;for (int i = 0,len = interfaces.length; i < len; i++){

iface=interfaces[i];

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

}

}

System.out.println("{");//6.获取类的属性

Field[] fields =c.getDeclaredFields();for(Field field : fields){

System.out.println(field.getName() + ";");

}//7.获取类的构造方法

Constructor[] constructors =c.getDeclaredConstructors();for(Constructor constructor : constructors){

System.out.print(constructor.getName() + "(");

Class[]params =constructor.getParameterTypes();for (int i = 0,len = params.length; i < len; i++){

System.out.print(params[i].getName());if(i != len - 1){

System.out.print(",");

}

}

System.out.print(") {...}\n");

}//8.获取类的方法

Method[] methods =c.getDeclaredMethods();for(Method mt : methods){

System.out.print(mt.getName() + "(");

Class[]params =mt.getParameterTypes();for (int i = 0,len = params.length; i < len; i++){

System.out.print(params[i].getName());if(i != len - 1){

System.out.print(",");

}

}

System.out.print(") {...}\n");

}

System.out.println("}");

}

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值