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方法的方式为,

 Class<T> clazz = T.class

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

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

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

 package jvmTest;

 import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Arrays; /*
//定义可重复注解
@Repeatable(Annos.class)
@interface Anno {}
@Retention(Value=RetentionPolicy.RUNTIME)
@interface Annos {
Anno[] value();
}
//使用4个注解修饰该类
@SuppressWarnings(value="unchecked")
@Deprecated
//使用重复注解修饰该类
@Anno
@Anno
*/
public class ClassTest { private ClassTest() {}
public ClassTest(String name) {
System.out.println("执行有参数构造器");
}
public void info() {
System.out.println("执行无参info");
}
public void info(String str) {
System.out.println("执行有参数info");
} class Inner {} public static void main(String[] args) throws Exception{
//获取ClassTest在JVM中对应的Class实例
Class<ClassTest> clazz = ClassTest.class;
//获取clazz对应类的全部构造器
Constructor[] ctors = clazz.getDeclaredConstructors();
System.out.println("ClassTest的全部构造器如下:");
for (Constructor c: ctors) {
System.out.println(c);
}
//获取所有public构造器
Constructor[] publicCtors = clazz.getConstructors();
System.out.println("ClassTest的全部public构造器如下:");
for (Constructor c: publicCtors) {
System.out.println(c);
}
//获取所有public方法
Method[] mtds = clazz.getMethods();
System.out.println("ClassTest所有public方法如下:");
for (Method md : mtds) {
System.out.println(md);
}
//获取指定方法
System.out.println("ClassTest中带一个字符串参数的info方法: " + clazz.getMethod("info", String.class));
//获取全部注解
Annotation[] anns = clazz.getAnnotations();
System.out.println("ClassTest全部注解如下: ");
for (Annotation an : anns) {
System.out.println(an);
}
// System.out.println("ClassTest类的@SuppressWarning注解为: " + Arrays.toString(clazz.getAnno))
//获取全部内部类
Class<?>[] inners = clazz.getDeclaredClasses();
System.out.println("ClassTest所有内部类: ");
for (Class<?> c : inners) {
System.out.println(c);
}
//使用forName()加载内部类
//Class inClazz = Class.forName("ClassTest$Inner");
//通过getDeclaringClass()访问该类所在的外部类
//System.out.println("inClazz对应的外部类: " + inClazz.getDeclaringClass());
System.out.println("ClassTest的包为: " + clazz.getPackage());
System.out.println("ClassTest的父类为: " + clazz.getSuperclass());
}
}

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. Lintcode: Wood Cut

    Given n pieces of wood with length L[i] (integer array). Cut them into small pieces to guarantee you ...

  2. 内存溢出之Tomcat内存配置

    设置Tomcat启动的初始内存其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4. 可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置 三.实例,以下给 ...

  3. :“boost/serialization/string.hpp”: No such file or directory 错误

    主要原因是没有安装和配置boost库. 解决:http://www.programlife.net/boost-compile-and-config.html

  4. Codeforce Round #221 Div2

    每次的CF都是一把辛酸泪! 什么时候能打破这局面,昨天做着睡着了! 有时候有的题目也就差一线! 哎,! A:杠杆原理! B:算最后负的和! B:没弄出来当时就脑短路... C:事后写了个n*log(n ...

  5. MFC架构

    MFC的六大关键技术: 1)MFC程序的初始化过程 2)消息映射 3)运行时类型识别(RTTI) 4)动态创建 5)永久保存 6)消息传递 一.MFC的初始化过程: MFC的架构组成: 1.要有CWi ...

  6. ACM常用算法及练习(1)

    ACM常用算法及练习 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短 ...

  7. Python基础(1)python+Eclipse+pydev环境搭建

    编辑器:Python 自带的 IDLE 简单快捷, 学习Python或者编写小型软件的时候.非常有用.         编辑器: Eclipse + pydev插件 1. Eclipse是写JAVA的 ...

  8. 使用Ef查询出现的问题The cast to value type 'System.Boolean' failed because the materialized value is null.的解决方法

    把值类型的系统.布尔的失败是因为物化值是null.结果类型的泛型参数或查询必须使用可空类型. 解决方法: 请确保你查询中的字段值不为空或者做为空判断

  9. 夺命雷公狗—angularjs—25—angular内置的方法(高级)

    查看版本信息 angular.version console.log(angular.version); 判断是否相等 angular.equals() var str1 = ''; var str2 ...

  10. 夺命雷公狗—angularjs—18—angularjs的事件

    对于一款前端框架,提起事件,很容易让人联想到DOM事件,比如说鼠标点击以及页面滚动等.但是我们这里说的angular中的事件和DOM事件并不是一个东西. 事件的发布 我们可以通过 $emit() 以及 ...