反射机制

GOLANG 反射法则

心已入冬 提交于 2019-12-27 00:24:52
译自[blog.golang.org/laws-of-reflection] 在计算机中, 反射是程序通过类型,检测到它自己的结构能力;是一种元编程程;也是一个具大的混淆点 在本文中,我们将通过解释反射是如何在GO中工作的来澄清它。每个语言的反射模式是不同的。本文着重于GO, 所以后文中的反射都是指GO中的反射 1.类型和接口 因为反射是修建于类型系统之上, 所以让我们从GO的类型开始讲吧。 GO是静态类型语言。 每个变量都有一个静态类型。 也就是说, 每一个已经类型在编译时已经固定了其类型:int, float32...等 假如我们声明如下: type MyInt int var i int var j MyInt 则i的类型为int; j的类型为MyInt;变量i和j有明显不同的静态类型, 而潜在下层类型, 他们可以彼此赋值不须要转换。 还有一种重要类型是接口类型,它代表了一组固定的方法集。一个接口变量能存储任一实体值,只要它实现了接口方法集。以大家所 熟知的接口为例, io.Reader和io.Writer, 它们的类型摘自io 包。 // Reader 就是一个包含了基本读方法的接口 type Reader interface { Read(p []byte[(n int, err error) } // Writher就是一个包含了基本写方法的接口 type Writer

Go语言反射规则

做~自己de王妃 提交于 2019-12-27 00:24:05
原文地址: http://blog.golang.org/laws-of-reflection ##介绍 反射在计算机的概念里是指一段程序审查自身结构的能力,主要通过类型进行审查。它是元编程的一种形式,同样也是引起混乱的重大来源。 在这篇文章里我们试图阐明Go语言中的反射是如何工作的。每种语言的反射模型是不同的(许多语言不支持反射),然而本文只与Go有关,所以我们接下来所提到的“反射”都是指Go语言中的反射。 ##类型与接口 由于反射是建立在类型系统(type system)上的,所以我们先来复习一下Go语言中的类型。 Go是一门静态类型的语言。每个变量都有一个静态类型,类型在编译的时后被知晓并确定了下来。 type MyInt int var i int var j MyInt 变量 i 的类型是 int ,变量 j 的类型是 MyInt 。虽然它们有着相同的基本类型,但静态类型却不一样,在没有类型转换的情况下,它们之间无法互相赋值。 接口是一个重要的类型,它意味着一个确定的的方法集合。一个接口变量可以存储任何实现了接口的方法的具体值(除了接口本身)。一个著名的例子就是 io.Reader 和 io.Writer : // Reader is the interface that wraps the basic Read method. type Reader interface

JAVA 注解的基本原理

巧了我就是萌 提交于 2019-12-26 23:02:24
以前,『XML』是各大框架的青睐者,它以松耦合的方式完成了框架中几乎所有的配置,但是随着项目越来越庞大,『XML』的内容也越来越复杂,维护成本变高。 于是就有人提出来一种标记式高耦合的配置方式,『注解』。方法上可以进行注解,类上也可以注解,字段属性上也可以注解,反正几乎需要配置的地方都可以进行注解。 关于『注解』和『XML』两种不同的配置模式,争论了好多年了,各有各的优劣,注解可以提供更大的便捷性,易于维护修改,但耦合度高,而 XML 相对于注解则是相反的。 追求低耦合就要抛弃高效率,追求效率必然会遇到耦合。本文意不再辨析两者谁优谁劣,而在于以最简单的语言介绍注解相关的基本内容。 注解的本质 「java.lang.annotation.Annotation」接口中有这么一句话,用来描述『注解』。 The common interface extended by all annotation types 所有的注解类型都继承自这个普通的接口(Annotation) 这句话有点抽象,但却说出了注解的本质。我们看一个 JDK 内置注解的定义: @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { } 这是注解 @Override 的定义,其实它本质上就是:

单例模式看着一篇就够了,破解谣言版!!!

放肆的年华 提交于 2019-12-26 22:36:26
大家好,今天给大家介绍一下单例模式。本文是从实际应用开发,结合网络上多篇技术博客,总结其精华、完善其缺陷和优化案例说明角度向大家展示什么叫做单例模式,如何创建单例及其优缺点和什么时候用单例。原创不易,点赞关注支持一下! 什么叫单例模式? 单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。 看起来很晦涩,白话一点说就是要具备某各类 只能有一个实例 、它必须自行创建这个实例和必须自行向整个系统提供这个实例。 如何创建实例? 单例的创建大致分为懒汉模式、饿汉模式、静态内部类、双重加锁等等。我们着重介绍和推荐使用的是双检锁模式,其他模式请自行百度 :-),话不多说直接上代码。 public class SingletonEntity { private volatile static SingletonEntity singtonEntity = null; private SingletonEntity(){ } public void test(String context){ System.out.println(context); } public static SingletonEntity getInstance(){ if (singtonEntity == null){ synchronized (SingletonEntity

反射原理及动态代理模式

流过昼夜 提交于 2019-12-26 16:02:25
目录 反射原理及动态代理模式 反射(Reflect) Class类 类加载器、构造器、Method、Field 代理模式(静态代理和动态代理) 静态代理 动态代理 使用了动态代理的`Retrofit 反射原理及动态代理模式 反射(Reflect) 反射之中包含了一个「反」字,所以了解反射我们先从「正」开始。 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。 反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。这时候,我们使用 JDK 提供的反射 API 进行反射调用。 反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。 Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。 Java反射机制主要提供了以下功能: 在运行时构造任意一个类的对象 在运行时获取任意一个类所具有的成员变量和方法 在运行时调用任意一个对象的方法(属性) Java 是一门面向对象的语言。在面向对象的世界里,万事万物皆对象,既然万事万物皆对象,那么我们的类是不是对象呢?我们写的每一个类都可以看成一个对象,是 java.lang

反射&XML

南笙酒味 提交于 2019-12-26 14:44:07
文章目录 Day13 反射&XML 反射 反射的作用 Class类的实例&哪些文件能生成class对象 获取Class对象的方式 获取构造方法 通过反射创建对象 获取方法 获取公共的方法(包括继承的方法) 获取全部的方法(不包括继承的方法) 获得字段: dom4j解析XML 对XML文档进行CRUD Day13 反射&XML 反射 什么是 反射 ### JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 就是对已经存在的类,获取其字段,方法 构造方法作相应(字段:,方法:,构造方法:) 反射的作用 增加程序的灵活性,避免将程序写死到代码里(解决硬编码的问题) java的反射机制知道类的基本结构,可以动态的去获取类这样的结构 可以让程序员在不知道其他程序员会有什么类的时候就编写完成自己的代码 反射的优点:灵活,功能强大(可以拿到私有化的.) 反射的缺点:破坏封装 影响性能 Class类的实例&哪些文件能生成class对象 Class类的实例表示正在运行的Java应用程序中的类和接口 枚举是一种类 注解是一种接口 每个数组属于被映射为Class对象的一个类,所有具有相同元素的类型和维数的数组都共享该Class对象 基本的Java类型

java -类加载器与反射

六月ゝ 毕业季﹏ 提交于 2019-12-26 04:45:03
类加载器 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过 加载,连接,初始化 三步来实现对这个 类进行初始化 。 l 加载 就是指将 class文件 读入内存,并为之创建一个 Class对象 。 任何类被使用时系统都会建立一个Class对象( 有且只有一个 ) l 连接 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 解析 将类的二进制数据中的符号引用替换为直接引用 l 初始化 就是我们以前讲过的初始化步骤 类初始化时机 1. 创建类的实例 2. 类的静态变量,或者为静态变量赋值 3. 类的静态方法 4. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 5. 初始化某个类的子类 6. 直接使用java.exe命令来运行某个主类 类加载器 l 负责将.class文件加载到内存中,并为之生成对应的 Class对象 。 l 虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行 类加载器的组成 l Bootstrap ClassLoader 根类加载器 (系统类) 也被称为引导类加载器,负责Java核心类的加载 比如System,String等。在JDK中JRE的lib目录下rt.jar文件中 l Extension ClassLoader 扩展类加载器

Java之反射机制

本小妞迷上赌 提交于 2019-12-25 19:58:03
今天我们就来讲讲java的反射机制。 当程序主动使用某个类的时候,如果该类还没有被加载到内存中,则系统会通过加载、连接、初始化这三个步骤对该类进行初始化,有时候会把这一整个流程叫做类加载器或类初始化 类加载时值将类文件读入到内存中,并且为该类创建一个对象、之后可以直接通过对象来调用类及其实现的父类方法和属性 一、反射机制到底是什么:类是由一组对象(拥有着共同属性)来组成的,而类与类之间也有共同的属性、构造方法、方法等结构,用来描述类的特性,即可以调用或查看某个类的属性、方法、即构造方法就叫做反射。 二、java反射机制的好处: 1.极大的提高了应用程序的扩展性,之前都是通过多来将子类对象传递给父类应用来实现的,大大的增加了代码的耦合性,并且无法访问真实对象的信息,这个时候就可以采取使用反射机制。 2.当代码需要后期维护的时候,则需要修改很多地方,而通过反射机制,只需要直接修改一个地方即可。 e.g Person person=new Student(); 三、应用场景:一般应用于底层框架的应用,不过大部分都已经封装好了的、以及可以实现工厂模式和代理模式等设计模式,同时也可以解决java泛型擦除等令人苦恼的问题 一个类的组成: 成员变量、成员方法、构造方法、修饰符、包等 四、反射的组成:1.Class(类本身) 2.Field(属性) 3.Method(方法)

java反射详解和动态代理

筅森魡賤 提交于 2019-12-25 19:05:27
最近闲来无事,刚好看到以前的java反射笔记,这里整理一下,有不足之处还望指出;   在学习java反射机制之前,我们先提出这么一个问题:在Java中,能不能在运行时针对一个Java类,获取它的属性和方法呢?   答案是肯定的,java中解决这个问题就是使用的我们今天需要讲的java反射机制。 1.什么是java反射?   java提供一种在运行时动态的获取class的方法和属性以及参数的机制,这种机制就是反射机制。换言之,java可以加载一个在运行时才得知名称的class,并获得它的详细结构(包括权限,继承类等等)。 在JDK中提供API来实现这种机制,API就是reflection APIs。在下文我们将详细了解reflection APIs 。 2.Reflection API详解   java内部是怎么实现这种机制的呢?让我们来详细看看Reflection API。java反射相关的API都在java.lang.reflect包中。结构图如下:    member接口: 用于获取类的构造方法,字段和成员方法。       AccessibleObject 类 :是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。(通俗解释一下就是获得了更高的使用权限);        Array

全面深入理解Java中的反射

青春壹個敷衍的年華 提交于 2019-12-25 13:12:13
一、简介 通过反射,Java代码可以发现有关已加载类的字段,方法和构造函数的信息,并可以在安全限制内对这些字段,方法和构造函数进行操作。 简而言之,你可以在运行状态中通过反射机制做到: 对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 使用Java反射主要涉及两个类(接口)Class, Member,如果把这两个类搞清楚了,反射基本就可以了。 二、Class类 对于每一种类,Java虚拟机都会初始化出一个Class类型的实例,每当我们编写并且编译一个新创建的类就会产生一个对应Class对象,并且这个Class对象会被保存在同名.class文件里。 当我们new一个新对象或者引用静态成员变量时,Java虚拟机(JVM)中的类加载器系统会将对应Class对象加载到JVM中,然后JVM再根据这个类型信息相关的Class对象创建我们需要实例对象或者提供静态变量的引用值。 比如创建编译一个Shapes类,那么,JVM就会创建一个Shapes对应Class类的Class实例,该Class实例保存了Shapes类相关的类型信息,包括属性,方法,构造方法等等,通过这个Class实例可以在运行时访问Shapes对象的属性和方法等