java反射-使用反射获取类的所有信息

时间:2022-01-05 15:42:45

博客已迁移到CSDN《https://blog.csdn.net/qq_33375499

在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 class ClassUtil { /**
* 获取 obj 对象的所有信息,并打印 obj 类
   * 该方法中,getXXXXs()方法都表示获取此对象所有 public 类型
   * 对应的方法getDeclaredXXXs()方法表示获取该对象实现的所有对象(万事万物皆对象),不论访问权限
* @param obj
*/
public static void getClassMsg(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 != ){
System.out.print(" implements ");
Class iface;
for (int i = ,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 = ,len = params.length; i < len; i++){
System.out.print(params[i].getName());
if(i != len - ){
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 = ,len = params.length; i < len; i++){
System.out.print(params[i].getName());
if(i != len - ){
System.out.print(",");
}
}
System.out.print(") {...}\n");
}
System.out.println("}");
}
}

java反射-使用反射获取类的所有信息的更多相关文章

  1. &lbrack;Java反射基础二&rsqb;获取类的信息

    本文接上文“Class类的使用”,以编写一个用来获取类的信息(成员函数.成员变量.构造函数)的工具类来讲解"反射之获取类的信息" 1.获取成员函数信息 /** * 获取成员函数信息 ...

  2. 浅谈Java反射机制 之 获取类的字节码文件 Class&period;forName&lpar;&quot&semi;全路径名&quot&semi;&rpar; 、getClass&lpar;&rpar;、class

    另一个篇:获取 类 的 方法 和 属性(包括构造函数) 先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...

  3. JAVA反射机制教程-获取类对象

    1. 什么是类对象 类对象,就是用于描述这种类,都有什么属性,什么方法的 2. 获取类对象 获取类对象有3种方式(1). Class.forName(2). Hero.class(3). new He ...

  4. 浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)

    上一篇 获取 类 的字节码文件 我们讲到了获取类的字节码文件的三种方法 第三种方法通过getClass("全路径名")获取字节码文件最符合要求 1.获取构造方法 先贴上我们要获取的 ...

  5. Java反射机制 之 获取类的 方法 和 属性(包括构造函数)(Day&lowbar;06)

    把自己立成帆,才能招来凤. 运行环境 JDK8 + IntelliJ IDEA 2018.3  本文中使用的jar包链接 https://files.cnblogs.com/files/papercy ...

  6. java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。

    首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一.  类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...

  7. 乐字节Java反射之一:反射概念与获取反射源头class

    一.Java反射机制概念 “程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”,如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAVA有着一个非常突出 ...

  8. 浅谈Java反射机制 之 使用类的 属性、方法和构造函数

    前面两篇我们总结了Java反射机制如何获取类的字节码,如何获取构造函数,属性和方法, 这篇我们将进一步验证如何使用我们获取到的属性.方法以及构造函数 1.使用 反射 获取到的 属性 import ja ...

  9. Java基础巩固——反射

    什么是反射 反射机制就是指程序运行时能够获取自身的信息.在Java中,只要给出类的名字,就可以通过反射机制来获取类的信息 哪里用的到反射机制 在jdbc中就是使用的反射来实例化对象,比如:Class. ...

随机推荐

  1. Java 根据两个经纬度坐标计算距离

    public class Distance{ private static final double EARTH_RADIUS = 6378137;    private static double  ...

  2. LeetCode 笔记系列六 Reverse Nodes in k-Group &lbrack;学习如何逆转一个单链表&rsqb;

    题目:Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...

  3. WCF 发布使用

    WCF发布,由于使用的是 net.tcp协议因此 需要在发布的WCF站点的管理网站-高级设置,连接协议中添加net.tcp的绑定 然后还需要在网站绑定编辑中添加net.tcp的绑定.否则访问的时候会出 ...

  4. 使用Matlab对灰度图像编程实现2D的傅里叶变换

    1.      先载入一幅灰度图像,如下: (非灰度图) 2. 利用函数fft2,对其进行快速傅立叶变换, 并利用函数fftshift 将变换后的图像原点移动到频率矩形的中心. 3. 利用abs()函 ...

  5. 机房收费系统(VB&period;NET)——存储过程实战

    最初接触存储过程是在耿建玲老师的视频里,当初仅仅是草草过了一遍.仅仅是有了个印象.知道了这个名词:大二时也有SqlServer数据库这门课,只是老师没讲,自己也没看:真正对存储过程的了解来自于自学考试 ...

  6. Vue站点的搭建之旅

      背景       很久没写博客了,这次博客分享一下最近上班空闲时间做的两个业余Demo.分别是V电影App的移动端站点[一直很喜欢用这个APP可是他们没有出对应的mobile端,所以自己开发一个, ...

  7. 开发Nginx模块Helloworld

    本文是对<深入理解Nginx>一书中的实例进行实战时的记录. 1模块目录结构 my_test_module/ ├── config └── ngx_http_mytest_module.c ...

  8. 实训任务03: 使用Eclipse创建MapReduce工程

    实训任务03: 使用Eclipse创建MapReduce工程 实训1: win7中使用Eclipse创建MapReduce工程 实训2:Centos 6.8系统中安装Eclipse 一.下载Eclip ...

  9. 1171 Big Event in HDU 01背包

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1171 题意:把商品分成两半,如不能均分,尽可能的让两个数相接近.输出结果:两个数字a,b且a>=b. ...

  10. 使用maven构建多模块项目,分块开发

    在多人使用Maven协作开发项目时,尤其是稍微上点规模的项目,每个RD的工作都细分到具体功能和模块,有些模块甚至还要单独部署. 我们假设有这样一个商城项目,包括以下几个模块: 商城前台(shop) 管 ...