Java通过反射查看类的信息示例
本文实例讲述了Java通过反射查看类的信息。分享给大家供大家参考,具体如下:
一点睛
1通过反射获取Class对象
使用Class类的forName()静态方法。该方法需要传入字符串参数,该字符串参数的值是某个类的全限定类名(必须添加完整包名)。
调用某个类的class属性来获取该类对应的Class对象。例如Person.class将会返回Person类对应的Class对象。
调用某个对象的getClass()方法,该方法是java.lang.Object类中的一个方法,所以所有Java对象都可以调用该方法,该方法将会返回该对象所属类对应的Class对象。
2从Class中获取信息
获取构造器
访问Class对应的类所包含的方法
访问Class对应的类所包含的属性(Field)
访问Class对应的类上所包含的注释。
访问该Class对象对应类包含的内部类。
访问该Class对象对应类所在的外部类。
访问该Class对象所对应类所继承的父类、所实现的接口等。
二实战
1代码
importjava.util.*; importjava.lang.reflect.*; importjava.lang.annotation.*; //定义可重复注解 @Repeatable(Annos.class) @interfaceAnno{ } @Retention(value=RetentionPolicy.RUNTIME) @interfaceAnnos{ Anno[]value(); } //使用4个注解修饰该类 @SuppressWarnings(value="unchecked") @Deprecated //使用重复注解修饰该类 @Anno @Anno publicclassClassTest{ //为该类定义一个私有的构造器 privateClassTest(){ } //定义一个有参数的构造器 publicClassTest(Stringname){ System.out.println("执行有参数的构造器"); } //定义一个无参数的info方法 publicvoidinfo(){ System.out.println("执行无参数的info方法"); } //定义一个有参数的info方法 publicvoidinfo(Stringstr){ System.out.println("执行有参数的info方法" +",其str参数值:"+str); } //定义一个测试用的内部类 classInner{ } publicstaticvoidmain(String[]args) throwsException{ //下面代码可以获取ClassTest对应的Class Classclazz=ClassTest.class; //获取该Class对象所对应类的全部构造器 Constructor[]ctors=clazz.getDeclaredConstructors(); System.out.println("ClassTest的全部构造器如下:"); for(Constructorc:ctors){ System.out.println(c); } //获取该Class对象所对应类的全部public构造器 Constructor[]publicCtors=clazz.getConstructors(); System.out.println("ClassTest的全部public构造器如下:"); for(Constructorc:publicCtors){ System.out.println(c); } //获取该Class对象所对应类的全部public方法 Method[]mtds=clazz.getMethods(); System.out.println("ClassTest的全部public方法如下:"); for(Methodmd:mtds){ System.out.println(md); } //获取该Class对象所对应类的指定方法 System.out.println("ClassTest里带一个字符串参数的info()方法为:" +clazz.getMethod("info",String.class)); //获取该Class对象所对应类的上的全部注解 Annotation[]anns=clazz.getAnnotations(); System.out.println("ClassTest的全部Annotation如下:"); for(Annotationan:anns){ System.out.println(an); } System.out.println("该Class元素上的@SuppressWarnings注解为:" +Arrays.toString(clazz.getAnnotationsByType(SuppressWarnings.class))); System.out.println("该Class元素上的@Anno注解为:" +Arrays.toString(clazz.getAnnotationsByType(Anno.class))); //获取该Class对象所对应类的全部内部类 Class>[]inners=clazz.getDeclaredClasses(); System.out.println("ClassTest的全部内部类如下:"); for(Classc:inners){ System.out.println(c); } //使用Class.forName方法加载ClassTest的Inner内部类 ClassinClazz=Class.forName("ClassTest$Inner"); //通过getDeclaringClass()访问该类所在的外部类 System.out.println("inClazz对应类的外部类为:"+ inClazz.getDeclaringClass()); System.out.println("ClassTest的包为:"+clazz.getPackage()); System.out.println("ClassTest的父类为:"+clazz.getSuperclass()); } }
2运行
ClassTest的全部构造器如下:
privateClassTest()
publicClassTest(java.lang.String)
ClassTest的全部public构造器如下:
publicClassTest(java.lang.String)
ClassTest的全部public方法如下:
publicstaticvoidClassTest.main(java.lang.String[])throwsjava.lang.Exception
publicvoidClassTest.info(java.lang.String)
publicvoidClassTest.info()
publicfinalvoidjava.lang.Object.wait()throwsjava.lang.InterruptedException
publicfinalvoidjava.lang.Object.wait(long,int)throwsjava.lang.InterruptedException
publicfinalnativevoidjava.lang.Object.wait(long)throwsjava.lang.InterruptedException
publicbooleanjava.lang.Object.equals(java.lang.Object)
publicjava.lang.Stringjava.lang.Object.toString()
publicnativeintjava.lang.Object.hashCode()
publicfinalnativejava.lang.Classjava.lang.Object.getClass()
publicfinalnativevoidjava.lang.Object.notify()
publicfinalnativevoidjava.lang.Object.notifyAll()
ClassTest里带一个字符串参数的info()方法为:publicvoidClassTest.info(java.lang.String)
ClassTest的全部Annotation如下:
@java.lang.Deprecated()
@Annos(value=[@Anno(),@Anno()])
该Class元素上的@SuppressWarnings注解为:[]
该Class元素上的@Anno注解为:[@Anno(),@Anno()]
ClassTest的全部内部类如下:
classClassTest$Inner
inClazz对应类的外部类为:classClassTest
ClassTest的包为:null
ClassTest的父类为:classjava.lang.Object
更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。