博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反射学习个人随笔
阅读量:4450 次
发布时间:2019-06-07

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

个人学习反射的过程记录在这里:

一:先学习了Class这个类的一些基本知识。

Class这个类是为了来描述其他类的。一个Class类的对象实际上就是一个类(个人理解)。

每个类都有一个对应的该类的一个对象。它是由系统创建的。此时不管我定义几个Class类的对象。

它都会指向同一个对象。

1 // 创建Class对象实例的三种方式。 2         // 1.类名.class 3         Class clazz = Person.class; 4         // 2.对象.getClass() 5         Class clazz1 = new Person().getClass(); 6         // 3.Class.forName("全类名") 用的最多也最普遍。java开发中的诸多框架都用到了反射机制。 7         Class clazz2 = Class.forName("com.company.reflection.Demo"); 8         System.out.println(clazz == clazz1 && clazz1 == clazz2); 9         // 打印结果为true.说明该类的在jre中的对象确实只有一个,它是由系统创建的。10     }

二:学习一下三种级别的类加载器。三个类加载器的继承关系也一目了然。

 

// 系统类加载器ClassLoader classLoader = this.getClass().getClassLoader();    System.out.println(classLoader);//sun.misc.Launcher$AppClassLoader@14ae5a5// 扩展类加载器classLoader = classLoader.getParent();    System.out.println(classLoader);//sun.misc.Launcher$AppClassLoader@14ae5a5// 引导类加载器(c++写的,无法获取)System.out.println(classLoader.getParent());//null

三:然后学习了constructor类,该类包含了反射过程执行中获取构造器的信息。

Class clazz = Class.forName("com.company.reflection.Demo");Constructor[] constructors = clazz.getConstructors();for (Constructor constructor : constructors) {       System.out.println(constructor);      // public com.infosys.reflection.Person()     // public com.infosys.reflection.Person(java.lang.String,int,double) }

 

四:接着学习了Method类。

Class clazz = Class.forName("com.company.reflection.Demo");        // 获取所有public的方法,包括父类的方法。        Method[] methods = clazz.getMethods();        for (Method method : methods) {            System.out.println("^^" + method.getName());            // ^^toString            // ^^getName            // ^^setName            // ^^getAge            // ^^getSalary            // ^^setSalary            // ^^setAge            // ^^wait            // ^^wait            // ^^wait            // ^^equals            // ^^hashCode            // ^^getClass            // ^^notify            // ^^notifyAll        }

 

// 只获取当前类中声明的方法。并且私有方法也可以获取。Method[] methods2 = clazz.getDeclaredMethods();    for (int i = 0; i < methods2.length; i++) {        System.out.println("__" + methods2[i].getName());            // __toString            // __getName            // __setName            // __getAge            // __getSalary            // __setSalary            // __setAge            // __privateMethod            //__protectedMethod            //__defaultMethod

五:学习Field类。

Class clazz = Person.class;        Field [] fields = clazz.getDeclaredFields();        for(Field f : fields){            System.out.println(f);            //public java.lang.String com.infosys.reflection.Person.nickName            //private java.lang.String com.infosys.reflection.Person.name            //private int com.infosys.reflection.Person.age            //private double com.infosys.reflection.Person.salary        }        Field [] fields2 = clazz.getFields();        for(Field field : fields2){            System.out.println(field);            //public java.lang.String com.infosys.reflection.Person.nickName        }

 

转载于:https://www.cnblogs.com/somary/p/6798707.html

你可能感兴趣的文章
我爱 哐 哐 哐,我是哐人类!-【废话区】
查看>>
WinPE启动U盘的制作方法与软件下载(通用PE工具箱/老毛桃/大白菜WinPE)(转载)...
查看>>
行为型设计模式之5--中介者模式
查看>>
Android DevArt6:Android中IPC的六种方式
查看>>
oracle练习题
查看>>
PMP学习感想
查看>>
Zookeeper全解析——Paxos作为灵魂
查看>>
集合-强大的集合工具类:java.util.Collections中未包含的集合工具
查看>>
CSS清除浮动
查看>>
数据库基础-数据库常用命令总结
查看>>
java8 按对象属性值排序
查看>>
[转帖]nvidia nvlink互联与nvswitch介绍
查看>>
[cnblog新闻]历史性时刻:云硬件支出首次高于传统硬件
查看>>
[转帖]Oracle dba_objects和all_objects 最大的区别
查看>>
【转帖】国产x86处理器KX-6000发布
查看>>
RSA算法及其在iOS中的使用
查看>>
04-js的运算符
查看>>
第三天 while循环 及其用法
查看>>
Delphi 10 seattle 去掉自带的代码连接线
查看>>
构建高并发高可用的电商平台架构实践(转)
查看>>