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

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 }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值