摘要:在思否上面开了一个专栏,主要是想对零散的知识点做一个梳理,在与大家交流的同时,也加强自己的理解。今天主要谈一下中的反射机制,虽然实际编程中我们很少直接使用,但是反射机制却始终围绕着我们程序员。
在思否上面开了一个专栏,主要是想对零散的知识点做一个梳理,在与大家交流的同时,也加强自己的理解。
今天主要谈一下Java中的反射机制,虽然实际编程中我们很少直接使用,但是反射机制却始终围绕着我们java程序员。我们知道由Java语言编写的程序需要经过编译和解释两个步骤,经过编译生成一种与平台无关的字节码文件,即*.class文件。将 *.class文件读入内存,并创建一个java.lang.Class对象的过程称为类的加载,在这儿我们先不谈类的加载机制,今天的重点是反射,之所以有上面的介绍,是因为反射就是通过该Class对象访问整个类的一个过程。
获取Class对象的三种方式:
使用Class类的forName(String clazzName)静态方法
调用某个类的class属性获取该类的Class对象,eg:Student.class
调用某个对象的getClass()方法, eg:student.getClass()
获取Class对应类所包含的构造方法
Constructor
Constructor
Constructor>[] getConstructors():返回对应类所有public构造方法
Constructor>[] getDeclaredConstructors():返回对应类的所有构造方法
获取Class对应类所包含的普通方法
Method getMethod(String name,Class> ... parameterTypes):返回对应类的带指定形参列表的public方法
Method[] getMethods():返回对应类的所有public方法
Method getDeclaredMethod(String name,Class> ... parameterTypes):返回对应类的带指定形参列表的方法
Method[] getDeclaredMethods():返回对应类的全部方法
获取Class对应类所包含的成员变量
Field getField(String name):返回对应类指定指定名称的public成员变量
Filed[] getFields():返回对应类的所有public成员变量
Filed getDeclaredField(String name):返回对应类的指定名称的成员变量
Filed[] getDeclaredFields():返回对应类的全部成员变量
上面利用Class对象获取对应类的构造方法、普通方法、成员变量都比较简单,之所以放在这儿,是方便查看,所以不给出示例代码。
接下来,着重介绍两个利用反射的典型例子:
这儿有具体的实现过程,有兴趣可以自己写一遍,有助于更好的理解
利用反射实现泛型的擦除public class GenericErasure { public static void main(String[] args) throws Exception { Listlist = new ArrayList<>(); list.add("你好"); Class extends List> clazz = list.getClass(); Method method = clazz.getMethod("add",Object.class); method.invoke(list, 1); for (Object ele : list) { System.out.println(ele); } } }
定义一个泛型为String的list集合,使用反射技术,可以实现泛型的擦除,加入int类型的值。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/69715.html
摘要:结构型模式适配器模式桥接模式装饰模式组合模式外观模式享元模式代理模式。行为型模式模版方法模式命令模式迭代器模式观察者模式中介者模式备忘录模式解释器模式模式状态模式策略模式职责链模式责任链模式访问者模式。 主要版本 更新时间 备注 v1.0 2015-08-01 首次发布 v1.1 2018-03-12 增加新技术知识、完善知识体系 v2.0 2019-02-19 结构...
摘要:可实现单例模式代码块初始化静态变量,只被执行一次内部类不能与外部类重名,只能访问外部类静态数据包括私有多分支选择整型或字符类型变量或整数表达式开始支持。 前言 大学期间接触 Java 的时间也不短了,不论学习还是实习,都让我发觉基础的重要性。互联网发展太快了,各种框架各种技术更新迭代的速度非常快,可能你刚好掌握了一门技术的应用,它却已经走在淘汰的边缘了。 而学习新技术总要付出一定的时间...
摘要:接口与类型信息关键字的一种重要目标就是允许程序员隔离构件,进而降低耦合性。如果你编写接口,那么就可以实现这一目标,但是通过类型信息,这种耦合性还是会传播出去接口并非是对解耦的一种无懈可击的保障。 点击进入我的博客 运行时类型信息使得你可以在运行时发现和使用类型信息,主要有两种方式: 传统的RTTI,它假定我们在编译时已经知道了所有的类型; 反射机制,它允许我们在运行时发现和使用类的...
摘要:这种语法,在中被称为动态代理。在动态代理机制中,这个角色只能是接口。动态代理就是实现的技术之一。 所谓动态代理,指的是语言提供的一种语法,能够将对对象中不同方法的调用重定向到一个统一的处理函数中来。python重写__getattr__函数能够做到这一点,就连世界上最好的语言也提供称为魔术方法的__call。这种语法除了能更好的实现动态代理外,还是RPC框架实现原理的一部分。 动态代理...
阅读 674·2021-09-30 09:47
阅读 2867·2021-09-04 16:40
阅读 851·2019-08-30 13:18
阅读 3446·2019-08-29 16:22
阅读 1550·2019-08-29 12:36
阅读 581·2019-08-29 11:11
阅读 1473·2019-08-26 13:47
阅读 1125·2019-08-26 13:32