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程序设计有所帮助。