反射机制

java基础(Reflection--反射)

我的未来我决定 提交于 2019-11-26 16:51:21
反射机制   – 指的是可以于运行时加载、探知、使用编译期间完全未知的类。   – 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法;    对于任意一个对象,都能够调用它的任意一个方法和属性;     Class c = Class.forName("com.bjsxt.test.User");   – 加载完类之后,在堆内存中,就产生了一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象就包含了完整的类的结构信息。   我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。 Class类   java.lang.Class类十分特殊,用来表示java中类型(class/interface/enum/annotation/primitive type/void)本身。     – Class类的对象包含了某个被加载类的结构。一个被加载的类对应一个Class对象。     – 当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象。   Class类是Reflection的根源。     – 针对任何您想动态加载、运行的类,唯有先获得相应的Class 对象  

Java反射-高级开发必须懂的

谁都会走 提交于 2019-11-26 16:11:39
理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助。 一:Class类的使用 ①.万事万物皆对象,(当然,基本数据类型,静态成员不是面向对象(属于类的)),所以我们创建的每一个类也都是对象,即类本身是java.lang.Class类的实例对象,但是这些对象都不需要new出来,因为java.lang.Class类的构造方法是私有的。 ②.任何一个类都是Class类的实例对象,这个实例对象有三种表示方式:(我们新建一个Student类) Class c1 = Student.class;//实际告诉我们任何一个类都有一个隐含的静态成员变量class(知道类名时用) Class c2 = stu.getClass();//已知该类的对象通过getClass方法(知道对象时用) Class c3 = Class.forName("类的全名");//会有一个ClassNotFoundException异常 官网解释说:c1,c2表示了Student类的类类型()class type),万事万物皆对象,类也是对象,是Class类的实例对象,这个对象我们成为该类的类类型(有点乱,但是慢慢捋一下还是能理解的) 这里有一点值得注意,当我们执行System.out.println(c1==c2);语句

Java反射机制详解

£可爱£侵袭症+ 提交于 2019-11-26 13:22:17
基础 编译期 和 运行期 ,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java代码编译成jvm识别的字节码文件,而运行期指的是将可执行文件交给操作系统去执行,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性; 这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制 反射机制的实现核心就是通过实例化Class类来动态获得Java类的信息; 每一个自定义的类在编译成.class文件的时候都会创建一个对应的实例化的Class对象, Class对象是JVM用来保存普通类的信息的类——可以通过实例化Class类而得到一个普通类; 这种实现方式和JVM的懒加载机制相迎合——在需要的时候将需要的.class文件和Class对象加载进内存中; 懒加载:当Cat.java编译成Cat.class文件后并不会立即被加载到内存,而是在它的的静态成员第一次被访问时才被加载(这么看来,Cat的默认构造方法也是静态的!) Class对象的获得 得到一个实例对象对应的Class对象有以下三种方式: 1.通过实例变量的getClass()方法: 1 2 Dog dog = new Dog();//dog是类Dog的对象,Dog是类Class的实例对象; Class d = dog.getClass(

反射的应用:泛型擦除

不问归期 提交于 2019-11-26 12:26:16
今天我们将要讲述一下反射的一个小应用,来帮助我们更好的理解反射的原理,这个小应用就是**能否在一个泛型为String的List集合中添加Integer类型的数据?** 经过前两篇的讲述,我们已经知道反射最大的一个机制就是我们可以通过配置文件在运行过程中动态的改变要运行的类或者方法,也就是编译时对于要运行的类不先进行编译,而在运行时再进行查看具体是哪一个类要执行。 根据反射的上述特性我们就能想到泛型。泛型与反射的机制正好相反,也就是在编译时检查泛型,而在运行阶段不再检查(“伪泛型”),我们先来看一下泛型这一特性的原因: 1、我们首先写两个list集合,泛型分别为String和Integer: 1 List<Integer> lIntegers = new ArrayList<Integer>(); 2 List<String> lStrings = new ArrayList<String>(); 2、点击查看两个List的源码,可以发现两个不同泛型的List是同一个接口: 了解了伪泛型是怎么回事后,就可以开始进行我们的应用测试了: 1、首先创建一个泛型为String的List集合,并添加上String类型的值 1 List<String> list = new ArrayList<String>(); 2 list.add("爱跑步的大胖子"); 2、使用反射获取add方法

python之封装、多态、反射

落花浮王杯 提交于 2019-11-26 07:29:18
一、封装 1.1封装的定义 在程序设计中,封装是对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,其含义是其他程序无法调用。 要了解封装,离不开“私有化”,就是将类或者是函数中的某些属性限制在某个区域之内,外部无法调用。 1.2封装的用处 封装数据的主要原因是:保护隐私(把不想别人知道的东西封装起来) 封装方法的主要原因是:隔离复杂度 注意:在编程语言里,对外提供的接口(接口可理解为了一个入口),就是函数,称为接口函数,这与接口的概念还 不一样,接口代表一组接口函数的集合体。 1.3封装的两个层面 (1)类就是麻袋,这本身就是一种封装 (2)类中定义私有的,只有类的内部使用,外部无法访问 class People: _star='earth' #单下划线表示被隐藏起来 def __init__(self,name,id,age,salary): self.name=name self.id=id self.age=age self.salary=salary def get_id(self): print('[%s的身份证号是%s]'%(self.name,self.id)) p1=People('czd','62012393208',18,100000) print(p1._star) class People: __star='earth' #双下划綫 def _

反射的深入浅出

淺唱寂寞╮ 提交于 2019-11-26 02:05:58
刚开始接触反射这个概念,感觉反射这个机制很复杂很难懂,所以在这篇文章中对java的反射机制以个人的理解总结归纳。 1. 什么是反射? 什么是反射?在官方文档中是这样说的: Reflection is commonly used by programs which require the ability to examine ormodify the runtime behavior of applications running in the Java virtual machine. This is a relatively advanced feature and should be used only by developers whohave a strong grasp of the fundamentals of the language. With that caveat in mind, reflection is a powerful technique and can enable applications to perform operations which would otherwise be impossible 翻译一下: 反射技术通常被用来检测和改变应用程序在 Java 虚拟机中的行为表现。它是一个相对而言比较高级的技术

动态路由协议BGP反射器的配置

依然范特西╮ 提交于 2019-11-26 00:14:17
一、搭建如下拓扑图 二、设计思路:三个路由器配置属于AS100 AR1与AR3,AR2与AR3通过loopbck口建立BGP内部邻居 在AR3上配置反射器服务器,配置AR1和AR2为AR3的客户端 三、配置步骤: 1、配置各位路由器的IP,因为建立BGP邻居的条件是邻居之间要能互通,所以每个AS内部运行动态协议OSPF 配置命令如下: AR1:<Huawei>system //进入系统视图 [Huawei]sysname R1 //将路由器命名为R1 [R1]interface GigabitEthernet0/0/0 //进入路由器接口GigabitEthernet0/0/0 [R1-GigabitEthernet0/0/0]undo shutdown //开启端口 [R1-GigabitEthernet0/0/0]ip address 192.168.13.1 24 //在该端口配置IP地址 AR2:<Huawei>system //进入系统视图 [Huawei]sysname R2 //将路由器命名为R2 [R1]interface GigabitEthernet0/0/0 //进入路由器接口GigabitEthernet0/0/0 [R1-GigabitEthernet0/0/0]undo shutdown //开启端口 [R1-GigabitEthernet0/0/0

gopl 反射2

…衆ロ難τιáo~ 提交于 2019-11-25 23:22:37
本篇各章节的主要内容: 使用 reflect.Value 来设置值:通过 Elem() 方法获取指针对应的值,然后就可以修改值 示例,解码 S 表达式:之前内容的综合运用 访问结构体成员标签:像JSON反序列化那样,使用反射获取成员标签,并填充结构体的字段 显示类型的方法:通过一个简单的示例,获取任意值的类型,并枚举它的方法,还可以调用这些方法 注意事项:慎用反射,原因有三 使用 reflect.Value 来设置值 到目前为止,反射只是用来 解析 变量值。本节的重点是 改变 值。 可寻址的值(canAddr) reflect.Value 的值,有些是可寻址的,有些是不可寻址的。通过 reflect.ValueOf(x) 返回的 reflect.Value 都是不可寻址的。但是通过指针提领得来的 reflect.Value 是可寻址的。可以通过调用 reflect.ValueOf(&x).Elem() 来获得任意变量 x 可寻址的 reflect.Value 值。 可以通过变量的 CanAddr 方法来询问 reflect.Value 变量是否可寻址: x := 2 // value type variable? a := reflect.ValueOf(2) // 2 int no b := reflect.ValueOf(x) // 2 int no c := reflect

C++反射机制:可变参数模板实现C++反射

自作多情 提交于 2019-11-25 23:07:18
1. 概要   本文描述一个通过C++可变参数模板实现C++反射机制的方法。该方法非常实用,在 Nebula 高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能。   C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。关于可变参数模板的原理和应用不是本文重点,不过通过本文中的例子也可充分了解可变参数模板是如何应用的。   熟悉Java或C#的同学应该都知道反射机制,很多有名的框架都用到了反射这种特性,简单的理解就是只根据类的名字(字符串)创建类的实例。 C++并没有直接从语言上提供反射机制给我们用,不过无所不能的C++可以通过一些trick来实现反射。 Bwar 也是在开发Nebula框架的时候需要用到反射机制,在网上参考了一些资料结合自己对C++11可变参数模板的理解实现了C++反射。 2. C++11之前的模拟反射机制实现    Nebula 框架是一个高性能事件驱动通用网络框架,框架本身无任何业务逻辑实现,却为快速实现业务提供了强大的功能、统一的接口。业务逻辑通过从Nebula的Actor类接口编译成so动态库,Nebula加载业务逻辑动态库实现 各种功能Server ,开发人员只需专注于业务逻辑代码编写,网络通信、定时器、数据序列化反序列化