Class实例

当类被加载之后,JVM中就会生成一个Class实例,通过这个实例就可以访问JVM中的这个类。有三种方式可以获取Class对象

使用Class的静态方法forName(完整包名)

调用类自身的class属性

调用类对象的getClass方法。 该方法继承自java.lang.Object,任何对象都有这个方法。

通常情况下,推荐用第二种方式。因为第二种方式既不需要重建对象,也不需要调用方法,而是直接读取类的属性。

从Class实例中获取类的信息

Class类提供了大量方法来获取Class实例所对应的类的信息,下面是一些常用的方法,

Constructor getConstructor(Class...parameterTypes), 返回类中带参数的构造函数

Method getMethod(String name, Class>...parameterTypes), 返回带参数的指定方法

Filed getFiled(String name), 返回类中的属性变量

关于不定形参Class...parameterTypes的解释,

例如类中有两个同名方法,

public void info(String name),

public void info(String name, int age)

如果用反射的方法,仅仅通过方法名是无法区分开的,因此需要指明形参

这里的形参用的是Class 类型的,即 java.lang.String 这种,而不是字符串的String类型,

正如上面第一节所说,使用 类名.class 可以获取这个类在JVM中的Class实例, 所以要使用反射来获取上面两个类的info方法的方式为,

1 Class clazz = T.class

2

3 clazz.getMethod("info", String.class)4

5 clazz.getMethod("info", String.class, Integer.class)

下面例子演示了Class 的大部分方法,如何从Class实例中获取对应类的信息,

1 packagejvmTest;2

3 importjava.lang.annotation.Annotation;4 importjava.lang.annotation.Retention;5 importjava.lang.reflect.Constructor;6 importjava.lang.reflect.Method;7 importjava.util.Arrays;8

9 /*

10 //定义可重复注解11 @Repeatable(Annos.class)12 @interface Anno {}13 @Retention(Value=RetentionPolicy.RUNTIME)14 @interface Annos {15 Anno[] value();16 }17 //使用4个注解修饰该类18 @SuppressWarnings(value="unchecked")19 @Deprecated20 //使用重复注解修饰该类21 @Anno22 @Anno23 */

24 public classClassTest {25

26 privateClassTest() {}27 publicClassTest(String name) {28 System.out.println("执行有参数构造器");29 }30 public voidinfo() {31 System.out.println("执行无参info");32 }33 public voidinfo(String str) {34 System.out.println("执行有参数info");35 }36

37 classInner {}38

39 public static void main(String[] args) throwsException{40 //获取ClassTest在JVM中对应的Class实例

41 Class clazz = ClassTest.class;42 //获取clazz对应类的全部构造器

43 Constructor[] ctors =clazz.getDeclaredConstructors();44 System.out.println("ClassTest的全部构造器如下:");45 for(Constructor c: ctors) {46 System.out.println(c);47 }48 //获取所有public构造器

49 Constructor[] publicCtors =clazz.getConstructors();50 System.out.println("ClassTest的全部public构造器如下:");51 for(Constructor c: publicCtors) {52 System.out.println(c);53 }54 //获取所有public方法

55 Method[] mtds =clazz.getMethods();56 System.out.println("ClassTest所有public方法如下:");57 for(Method md : mtds) {58 System.out.println(md);59 }60 //获取指定方法

61 System.out.println("ClassTest中带一个字符串参数的info方法: " + clazz.getMethod("info", String.class));62 //获取全部注解

63 Annotation[] anns =clazz.getAnnotations();64 System.out.println("ClassTest全部注解如下: ");65 for(Annotation an : anns) {66 System.out.println(an);67 }68 //System.out.println("ClassTest类的@SuppressWarning注解为: " + Arrays.toString(clazz.getAnno))69 //获取全部内部类

70 Class>[] inners =clazz.getDeclaredClasses();71 System.out.println("ClassTest所有内部类: ");72 for (Class>c : inners) {73 System.out.println(c);74 }75 //使用forName()加载内部类76 //Class inClazz = Class.forName("ClassTest$Inner");77 //通过getDeclaringClass()访问该类所在的外部类78 //System.out.println("inClazz对应的外部类: " + inClazz.getDeclaringClass());

79 System.out.println("ClassTest的包为: " +clazz.getPackage());80 System.out.println("ClassTest的父类为: " +clazz.getSuperclass());81 }82 }

java 查看类_JAVA基础知识之JVM-——通过反射查看类信息相关推荐

  1. java程序运行必须得三个io类_Java基础知识(三)

    一.hashCode 与 equals (重要) 面试官可能会问你:"你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?" 1 ...

  2. java保护型数据成员_Java基础知识笔记第四章:类和对象

    编程语言的几个发展阶段 面向机器语言 面向过程语言 面向对象语言:封装.继承.多态 类 类声明 classPerson{ ....... }class植物{ ....... } 类体 类使用类体来描述 ...

  3. java io 对象_JAVA基础知识之IO——对象序列化

    对象序列化 Java对象序列化(Serialize)是指将Java对象写入IO流,反序列化(Deserilize)则是从IO流中恢复该Java对象. 对象序列化将程序运行时内存中的对象以字节码的方式保 ...

  4. java.io.file()_JAVA基础知识之IO-File类

    File类介绍 File是java.io包下面的一个类,代表与平台无关的文件或者目录.JAVA中,无论文件还是目录,都可以看作File类的一个对象.File类能对文件或目录新建,删除,获取属性等操作, ...

  5. java class 字符串_java基础知识四 math类 字符 字符串 控制台输入输出 StringBuilder与StringBuffer...

    第四章:数学函数.字符和字符串 math类 Math是final类:在java.lang.Math中,所有数学函数都是静态方法 在一个java程序中,java.lang包中的所有类是隐式导入的. 三角 ...

  6. java.util 常见_Java基础知识-java.util.concurrent包下常见类的使用

    一,Condition 一个场景,两个线程数数,同时启动两个线程,线程A数1.2.3,然后线程B数4.5.6,最后线程A数7.8.9,程序结束,这涉及到线程之间的通信. public classCon ...

  7. java e次方_java基础知识

    一.java的简介 1.后台开发语言.跨平台,安全性高.面向对象 二.java基础 1.类是java中最小编写代码的单元 2.语句要分号结束 3.括号成对出现 4.运行原理--从上往下 三.注释:代码 ...

  8. java 集合数据类型_Java基础知识(数据类型和集合)

    一.数据类型 包装类型 包装类型是对基本数据类型不足之处的补充. 基本数据类型的传递方式是值传递,而包装类型是引用传递,同时提供了很多数据类型间转换的方法. Java1.5 以后可以自动装箱和拆箱 二 ...

  9. java用构造方法定义book类_JAVA基础学习之路(三)类定义及构造方法

    类的定义及使用 一,类的定义 classBook {//定义一个类intprice;//定义一个属性intnum;public static int getMonney(int price, intn ...

最新文章

  1. java+自定义异常类+输入若干成绩 为负数时输出抛出异常_java+自定义异常类+输入若干成绩 为...
  2. 解构亚马逊Alexa的1.5万种技能
  3. chosen组件实现下拉框
  4. 转:如何求出grid图像每个cell对应的x,y坐标?
  5. linux网络设备—mdio总线
  6. LeetCode 155. Min Stack
  7. java 多线程的一种实现方式
  8. 用Python爬取3万多条评论,看韩国人如何评价电影《寄生虫》?
  9. 深入理解Java面向对象三大特性 封装 继承 多态
  10. php和fastapi,FastAPI快速开始
  11. 编译编译时,用不到的库,一定不要链接
  12. JAVA API中文在线帮助文档
  13. js将 0,1,2,3...转成一,二,三....(数字转换大写)
  14. python画图——雪花(科赫曲线)
  15. Beta 多样性排序分析方法与比较
  16. Javascript实现全屏阅读和复制功能
  17. 12306极速全自动抢票
  18. 【MyBatis 面试题】
  19. 基本电路知识(电阻电源受控源)
  20. 6.nand flash

热门文章

  1. 方格网的填方和挖方计算
  2. python多重插补_5.4 缺失值插补
  3. 表单重复提交(前端未做单击防重复点击策略)
  4. 页面中的表格如何画斜线
  5. 如临现场的视觉感染力,NBA决赛直播还能这样看?
  6. 拼多多进军教育,学习也能「砍一刀」?
  7. 今日杂感-20220322
  8. 爱可信携手Marvell展示爱可信Linux平台
  9. listview下拉刷新上拉加载扩展(三)-仿最新版美团外卖
  10. SDK实现APP一键登录文档