博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反射应用二:获取运行时类的完整结构
阅读量:3965 次
发布时间:2019-05-24

本文共 6279 字,大约阅读时间需要 20 分钟。

我们可以通过反射,获取对应的运行时类中所有的属性、方法、构造器、父类、接口、父类的泛型、包、注解、异常等。。。。

典型代码:

1.获取属性:权限修饰符 数据类型 变量名

public class FiledTest {
@Test public void test(){
Class clazz = Person.class; //获取属性结构 //getFields():获取当前运行时类及其父类、接口中声明为public访问权限的属性 Field[] fields = clazz.getFields(); for(Field f : fields){
System.out.println(f); } System.out.println(); //getDeclaredFields():获取当前运行时类中声明的所属性(包括公、默认、私,但不包含父类及其接口中声明的属性 Field[] declaredFields = clazz.getDeclaredFields(); for(Field f : declaredFields){
System.out.println(f); } } //权限修饰符 数据类型 变量名 @Test public void test1(){
Class clazz = Person.class; //权限修饰符 Field[] declaredFields = clazz.getDeclaredFields(); for(Field f : declaredFields){
//权限修饰符 int modifiers = f.getModifiers(); System.out.print(Modifier.toString(modifiers) + " "); //数据类型 Class type = f.getType(); System.out.print(type.getName() + " "); //变量名 String name = f.getName(); System.out.print(name); System.out.println(); } }}

2.获取方法:权限修饰符 返回值类型 方法名(参数类型1 形参名1,…) throws XxxException{}

public class MethodTest {
@Test public void test1(){
Class clazz = Person.class; //getMethods():获取当前运行时类及其所父类(包括Object)中声明为public权限的方法 Method[] methods = clazz.getMethods(); for(Method m : methods){
System.out.println(m); } System.out.println(); //getDeclaredMethods():获取当前运行时类中声明的所方法。(不包含父类中声明的方法 Method[] declaredMethods = clazz.getDeclaredMethods(); for(Method m : declaredMethods){
System.out.println(m); } } /* @Xxxx 权限修饰符 返回值类型 方法名(参数类型1 形参名1,...) throws XxxException{} */ @Test public void test2(){
Class clazz = Person.class; Method[] declaredMethods = clazz.getDeclaredMethods(); for(Method m : declaredMethods){
//1.获取方法声明的注解 Annotation[] annotations = m.getAnnotations(); for (Annotation a : annotations){
System.out.println(a); } //2.权限修饰符 int modifiers = m.getModifiers(); System.out.print(Modifier.toString(modifiers) + " "); //3.返回值类型 Class returnType = m.getReturnType(); System.out.print(returnType.getName() + " "); //4.方法名 String name = m.getName(); System.out.print(name + "("); //5.形参列表 Class[] parameterTypes = m.getParameterTypes(); if(parameterTypes.length > 0){
for (int i = 0; i < parameterTypes.length; i++) {
if(i == parameterTypes.length - 1){
System.out.print(parameterTypes[i].getName() +" " + "args_" + i); break; } System.out.print(parameterTypes[i].getName() + " " + "args_" + i + ","); } } System.out.print(")" + " "); //6.抛出的异常' Class[] exceptionTypes = m.getExceptionTypes(); if(exceptionTypes.length > 0){
System.out.print("throws" + " "); for (int i = 0; i < exceptionTypes.length; i++) {
if(i == exceptionTypes.length -1){
System.out.print(exceptionTypes[i].getName()); break; } System.out.print(exceptionTypes[i].getName() + ","); } } System.out.println(); } }}

3. 获取构造器结构

public class OtherTest {
/* 获取构造器结构 */ @Test public void test1() {
Class clazz = Person.class; //getConstructors():获取当前运行时类(不包括父类的)中声明为public的构造器 Constructor[] constructors = clazz.getConstructors(); for (Constructor c : constructors) {
System.out.println(c); } System.out.println(); //getDeclaredConstructors():获取当前运行时类中声明的所的构造器 Constructor[] declaredConstructors = clazz.getDeclaredConstructors(); for (Constructor c : declaredConstructors) {
System.out.println(c); } }

4.获取运行时类的父类

/*  获取运行时类的父类   */    @Test    public void test2() {
Class clazz = Person.class; Class superclass = clazz.getSuperclass(); System.out.println(superclass);//class loey.Person.Creature }

5. 获取运行时类的带泛型的父类

/*    获取运行时类的带泛型的父类     */    @Test    public void test3() {
Class clazz = Person.class; Type genericSuperclass = clazz.getGenericSuperclass(); System.out.println(genericSuperclass);//loey.Person.Creature
/* 获取运行时类的带泛型的父类的泛型 代码:逻辑性代码 vs 功能性代码 */ ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass; //获取泛型类型 Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // System.out.println(actualTypeArguments[0].getTypeName());// System.out.println(((Class)actualTypeArguments[0]).getName()); for (Type t : actualTypeArguments) {
System.out.println(t.getTypeName()); } }

6.获取运行时类实现的接口

/*   获取运行时类实现的接口    */    @Test    public void test4() {
Class clazz = Person.class; Class[] interfaces = clazz.getInterfaces(); for(Class i : interfaces){
System.out.println(i); } System.out.println(); //获取运行时类的父类实现的接口 Class superclass = clazz.getSuperclass(); Class[] interfaces1 = superclass.getInterfaces(); for(Class c : interfaces1){
System.out.println(c); } }

7. 获取运行时类所在的包

/*        获取运行时类所在的包     */    @Test    public void test5(){
Class clazz = Person.class; Package aPackage = clazz.getPackage(); System.out.println(aPackage); }

8.获取运行时类声明的注解

/*        获取运行时类声明的注解     */    @Test    public void test6(){
Class clazz = Person.class; Annotation[] annotations = clazz.getAnnotations(); for(Annotation a : annotations){
System.out.println(a); } }}

转载地址:http://rvuki.baihongyu.com/

你可能感兴趣的文章
C++小知识点
查看>>
【转载】zedboard中PL_GPIO控制(8个sw、8个leds)
查看>>
zedboard烧写程序到FLASH,用于QSPI Flash启动
查看>>
软件工程师,你必须知道的20个常识
查看>>
常用STL算法2_查找
查看>>
常用STL算法3_排序
查看>>
常用STL算法4_拷贝和替换
查看>>
常用STL算法5_算术和生成
查看>>
常用STL算法6_集合
查看>>
STL综合案例
查看>>
数据结构 的可视化
查看>>
比较版本号的大小 新旧
查看>>
01背包问题
查看>>
O(logn)时间复杂度求Fibonacci数列
查看>>
【转】腾讯十年运维老兵:运维团队的五个“杀手锏”
查看>>
Iterator_traits
查看>>
Zedboard中的SPI通信记录文档(已实现)
查看>>
zigbee学习笔记2----cc2530 IO实验
查看>>
zigbee学习笔记4----初次接触zstack
查看>>
Android 发布到google Play的app搜索不到问题的解决
查看>>