Class实例

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

  • 使用Class的静态方法forName(完整包名)
  • 调用类自身的class属性
  • 调用类对象的getClass方法。 该方法继承自java.lang.Object,任何对象都有这个方法。

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

从Class实例中获取类的信息

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

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

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

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

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

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

public void info(String name),

public void info(String name, int age)

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

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

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

  1. Class<T> clazz = T.class
  2.  
  3. clazz.getMethod("info", String.class)
  4.  
  5. clazz.getMethod("info", String.class, Integer.class)

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

  1. package jvmTest;
  2.  
  3. import java.lang.annotation.Annotation;
  4. import java.lang.annotation.Retention;
  5. import java.lang.reflect.Constructor;
  6. import java.lang.reflect.Method;
  7. import java.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. @Deprecated
  20. //使用重复注解修饰该类
  21. @Anno
  22. @Anno
  23. */
  24. public class ClassTest {
  25.  
  26. private ClassTest() {}
  27. public ClassTest(String name) {
  28. System.out.println("执行有参数构造器");
  29. }
  30. public void info() {
  31. System.out.println("执行无参info");
  32. }
  33. public void info(String str) {
  34. System.out.println("执行有参数info");
  35. }
  36.  
  37. class Inner {}
  38.  
  39. public static void main(String[] args) throws Exception{
  40. //获取ClassTest在JVM中对应的Class实例
  41. Class<ClassTest> 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基础知识之JVM-——通过反射查看类信息的更多相关文章

  1. JAVA基础知识总结18(反射)

    反射技术: 其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的 ...

  2. Java基础知识笔记第四章:类和对象

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

  3. java 基础知识学习 JVM虚拟机参数配置

    1) 设置-Xms.-Xmx相等: 2) 设置NewSize.MaxNewSize相等: 3) 设置Heap size, PermGen space: Tomcat 的配置示例:修改%TOMCAT_H ...

  4. Java基础知识强化92:日期工具类的编写和测试案例

    1. DateUtil.java,代码如下: package cn.itcast_04; import java.text.ParseException; import java.text.Simpl ...

  5. Java基础知识强化63:Arrays工具类之方法源码解析

    1. Arrays工具类的sort方法: public static void sort(int[] a): 底层是快速排序,知道就可以了,用空看. 2. Arrays工具类的toString方法底层 ...

  6. Java基础知识强化62:Arrays工具类之概述和使用

    1. Arrays工具类: Arrays这个类包含操作数组(比如排序和查找)的各种方法. 2. Arrays的方法: (1)toString方法:把数组转成字符串 public static Stri ...

  7. 学习Spring必学的Java基础知识(1)----反射(转)

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  8. 学习Spring必学的Java基础知识(1)----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  9. JAVA基础知识|java虚拟机(JVM)

    一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...

随机推荐

  1. PostgreSQL Replication之第十一章 使用Skytools(3)

    11.3 管理 pgq-queues Skytools 的一个核心组件是pgq.它提供了一个通用排队接口,它可以让您把消息从一个消息提供者传送到一个任意数目的接收者. 现在的问题是:一般来说,一个队列 ...

  2. Codeforce Round #213 Div2

    哎,弄了半天这次的C还是没出,真是捉急!,还TM的以为前几次只是运气不好!太逗了!

  3. PHP和JS实现多按钮提交表单

    JS: <html> <head> <script> function submitit1() //交由程序1处理 { document.myForm.action ...

  4. mysql之触发器before和after的区别

    我们先做个测试: 接上篇日志建的商品表g和订单表o和触发器 假设:假设商品表有商品1,数量是10: 我们往订单表插入一条记录: insert into o(gid,much) values(1,20) ...

  5. oracle的表空间

    创建表空间 1:创建单个文件的表空间 CREATE TABLESPACE SAMPLE LOGGING DATAFILE 'D:\11.dbf' SIZE 5M REUSE EXTENT MANAGE ...

  6. OpenGl And 视图

    OpenGl And 视图 标签(空格分隔): game 简介 本文主要介绍坐标系的观念, 以及在openGL中的视图及其相关的变换. 大纲 视图.模型.投影变换概念 Opengl中对各种变换的支持 ...

  7. 【sinatra】设置默认的端口

    加入 set :port, 8888 #默认4567

  8. 项目中empty遇到的一个问题

    搜索传参时,数据能获取到,搜索结果不是根据参数得出的,在定义搜索条件时因为empty引起的一个问题,键为0的值没有获取到, 记住:!empty 已经把0排除了

  9. Qt源码包中的一段代码

    之所以单独拣出来是因为Qt的开发者们给普通开发者提供了高效编程的商业代码例子: bool QWidget::testAttribute_helper(Qt::WidgetAttribute attri ...

  10. Calibrating delay loop... 问题以及解决方法(RealARM开发板)

    RealARM的210开发板在启动是有时会出现这样的死循环 Calibrating delay loop... ,那么原因是什么呢? 经过查找,发现跟RTC有关,实际上就是晶振和RTC电源的问题.所以 ...