导航:首页 > 源码编译 > 看一个组件源码

看一个组件源码

发布时间:2022-11-17 22:53:46

A. 如何在Eclipse中查看android源码或者第三方组件包源码

android源码需要在android sdk中下载才有的。

B. 怎么用火狐浏览器查看网页源代码

准备工具/材料:装有windows 10的电脑一台,火狐浏览器软件。

用火狐浏览器查看网页源代码的办法如下:

1、首先进入火狐浏览器浏览器首页,点击查看,如下图所示。

C. 怎么查看codeblocks的array源代码

具体安装步骤如下:
1、安装必要组件
代码:sudo apt-get install build-essential
代码:sudo apt-get install gdb
2、更新源
代码:gksudo gedit /etc/apt/sources.list
添加(以feisty为例):
代码:sudo apt-key add key.asc
4、安装最新 wxWidgets 库
代码:sudo apt-get update
代码:
sudo apt-get install libwxgtk2.8-0 libwxgtk2.8-dev wx2.8-headers wx-common
5、设置 wxWidgets 默认版本
代码:sudo update-alternatives --config wx-config
从列表中选择一项即可。
(个人推荐选择2)

6、与codeblocks相依赖的软件包的安装
(其中的dep是指的这个包的dev)
在这里要强调一点一定要安装gtk2.0+这个开发包,要不会在后面的configure中遇到问题:
代码
sudo apt-get install libgtk2.0-dev
以下就是所有的相关的依赖包,在这里不用安装,如果在configure阶段报错找不到的时候,回来查阅进行安装

libatk1.0-0 (>= 1.20.0)
The ATK accessibility toolkit

dep: libc6 (>= 2.4) [amd64]
GNU C 语言运行库:共享库
同时作为一个虚包由这些包填实: libc6-udeb
dep: libc6 (>= 2.7) [i386]

dep: libcairo2 (>= 1.6.0)
The Cairo 2D vector graphics library

dep: libcomerr2 (>= 1.01)
通用错误描述库

dep: libcups2 (>= 1.3.8)
Common UNIX Printing System(tm) - libs

dep: libfontconfig1 (>= 2.4.0)
generic font configuration library - runtime

dep: libfreetype6 (>= 2.3.5)
FreeType 2 font engine, shared library files

dep: libglib2.0-0 (>= 2.18.0)
The GLib library of C routines

dep: libgnutls26 (>= 2.4.0-0)
GNU TLS 库 - 运行时库

dep: libgtk2.0-common
Common files for www.hbbz08.com the GTK+ graphical user interface library

dep: libjpeg62
The Independent JPEG Group's JPEG runtime library

dep: libkrb53 (>= 1.6.dfsg.2)
MIT Kerberos runtime libraries

dep: libpango1.0-0 (>= 1.21.6)
Layout and rendering of internationalized text

dep: libpng12-0 (>= 1.2.13-4)
PNG library - runtime

dep: libtiff4
Tag Image File Format (TIFF) library

dep: libx11-6
X11 client-side library

dep: libxcomposite1 (>= 1:0.3-1)
X11 Composite extension library

dep: libxcursor1 (>> 1.1.2)
X cursor management library

dep: libxdamage1 (>= 1:1.1)
X11 damaged region extension library

dep: libxext6
X11 miscellaneous extension library

dep: libxfixes3 (>= 1:4.0.1)
X11 miscellaneous 'fixes' extension library

dep: libxi6 (>= 2:1.1.3-1ubuntu3)
X11 Input extension library

D. 2021-02-03【技术】聊聊keep-alive组件的使用及其实现原理

keep-alive定义:
keep-alive是Vue.js的一个内置组件。它能够不活动的组件实例保存在内存中,而不是直接将其销毁,它是一个抽象组件,不会被渲染到真实DOM中,也不会出现在父组件链中。

它提供了include与exclude两个属性,允许组件有条件地进行缓存。

这里的component组件会被缓存起来。

举个栗子

在点击button时候,coma与comb两个组件会发生切换,但是这时候这两个组件的状态会被缓存起来,比如说coma与comb组件中都有一个input标签,那么input标签中的内容不会因为组件的切换而消失。

props
keep-alive组件提供了include与exclude两个属性来允许组件有条件地进行缓存,二者都可以用逗号分隔字符串、正则表达式或一个数组来表示。
include: 字符串或正则表达式。只有匹配的组件会被缓存。
exclude: 字符串或正则表达式。任何匹配的组件都不会被缓存。

keep-alive的声明周期执行
页面第一次进入,钩子的触发顺序
created-> mounted-> activated,退出时触发 deactivated
当再次进入(前进或者后退)时,只触发 activated
事件挂载的方法等,只执行一次的放在 mounted 中;组件每次进去执行的方法放在 activated 中;

将缓存name为a的组件。

name为a的组件将不会被缓存。
注意:此处的name值是与在名称为component组件中的name值对应的。

生命钩子
keep-alive提供了两个生命钩子,分别是activated与deactivated。

被keepalive包含的组件不会被再次初始化,也就意味着不会重走生命周期函数
但是有时候是希望我们缓存的组件可以能够再次进行渲染,这时 Vue 为我们解决了这个问题
被包含在 keep-alive 中创建的组件,会多出两个生命周期的钩子: activated 与 deactivated:
activated 当 keepalive 包含的组件再次渲染的时候触发
deactivated 当 keepalive 包含的组件销毁的时候触发
keep-alive是一个抽象的组件,keep-alive会将组件保存在内存中,并不会销毁以及重新创建,所以不会重新调用组件的created等方法,缓存的组件不会被 mounted,为此需要用activated与deactivated这两个生命钩子来得知当前组件是否处于活动状态。

参数理解

keep-alive 可以接收3个属性做为参数进行匹配对应的组件进行缓存:

include 包含的组件(可以为字符串,数组,以及正则表达式,只有匹配的组件会被缓存)
exclude 排除的组件(以为字符串,数组,以及正则表达式,任何匹配的组件都不会被缓存)
max 缓存组件的最大值(类型为字符或者数字,可以控制缓存组件的个数)
注:当使用正则表达式或者数组时,一定要使用 v-bind

遇见 vue-router 结合router使用,缓存部分页面

所有路径下的视图组件都会被缓存

如果只想要router-view里面的某个组件被缓存,怎么办?
1、使用 include/exclude
2、使用 meta 属性

缺点:需要知道组件的 name,项目复杂的时候不是很好的选择

优点:不需要例举出需要被缓存组件名称

使用$route.meta的keepAlive属性:

需要在router中设置router的元信息meta:

说完了keep-alive组件的使用,我们从源码角度看一下keep-alive组件究竟是如何实现组件的缓存的呢?

created钩子会创建一个cache对象,用来作为缓存容器,保存vnode节点。

destroyed钩子则在组件被销毁的时候清除cache缓存中的所有组件实例。

假设这里有 3 个路由: A、B、C。

需求如下:
默认显示 A
B 跳到 A,A 不刷新
C 跳到 A,A 刷新

实现方式如下:
在 A 路由里面设置 meta 属性:

在 B 组件里面设置 beforeRouteLeave:

在 C 组件里面设置 beforeRouteLeave:

这样便能实现 B 回到 A,A 不刷新;而 C 回到 A 则刷新。

防坑指南
1.keep-alive 先匹配被包含组件的 name 字段,如果 name 不可用,则匹配当前组件 components 配置中的注册名称。
2.keep-alive 不会在函数式组件中正常工作,因为它们没有缓存实例。
3.当匹配条件同时在 include 与 exclude 存在时,以 exclude 优先级最高(当前vue 2.4.2 version)。比如:包含于排除同时匹配到了组件A,那组件A不会被缓存。
4.包含在 keep-alive 中,但符合 exclude ,不会调用 activated 和 deactivated。

keep-alive生命周期钩子函数:activated、deactivated
使用<keep-alive>会将数据保留在内存中,如果要在每次进入页面的时候获取最新的数据,需要在activated阶段获取数据,承担原来created钩子中获取数据的任务。

附录,题外话
生命周期函数:就是vue在某个时间段会自动执行的函数

1、beforeCreate(){}在执行的时候,data还有methods都没有被初始化。
2、created(){} data还有methods都被初始化好了,如果要调用 methods 方法或者操作 data 里面的数据,最早只能在 created 里面进行操作。
3、beforeMount(){} 表示模板已经在内存中编辑完成了,但是尚未渲染到模板页面中。即页面中的元素,没有被真正的替换过来,只是之前写的一些模板字符串。
4、mounted(){} 表示内存中模板已经真实的挂载到页面中去了,用户可以看到渲染好的界面了
注意这是一个生命周期函数的最后一个函数了,执行完这个函数表示 整个vue实例已经初始化完成了,组件脱离了创建阶段,进入运行阶段。

下面是运行期间的两个生命周期函数的钩子:
5、beforeUpdate(){} 表示我们的界面还没更新 但是data里面的数据是最新的。即页面尚未和最新的data里面的数据保持同步。
6、update(){} 表示页面和data里面的数据已经包吃同步了 都是最新的。
7、beforeDestory(){} 当执行这个生命周期钩子的时候 vue的实例从运行阶段进入销毁阶段 此时实例身上的data 还有 methods处于可用的状态。
8、Destoryed(){} 表示组件已经完全被销毁了 组件中所有的实例方法都是不能用了

E. “SpringCloud原理”Ribbon核心组件以及运行原理万字源码剖析

大家好,本文我将继续来剖析SpringCloud中负载均衡组件Ribbon的源码。本来我是打算接着OpenFeign动态代理生成文章直接讲Feign是如何整合Ribbon的,但是文章写了一半发现,如果不把Ribbon好好讲清楚,那么有些Ribbon的细节理解起来就很困难,所以我还是打算单独写一篇文章来剖析Ribbon的源码,这样在讲Feign整合Ribbon的时候,我就不再赘述这些细节了。好了,话不多说,直接进入主题。

这是个很简单的东西,就是服务实例数据的封装,里面封装了服务实例的ip和端口之类的,一个服务有很多台机器,那就有很多个Server对象。

ServerList是个接口,泛型是Server,提供了两个方法,都是获取服务实例列表的,这两个方法其实在很多实现类中实现是一样的,没什么区别。这个接口很重要,因为这个接口就是Ribbon获取服务数据的来源接口,Ribbon进行负载均衡的服务列表就是通过这个接口来的,那么可以想一想是不是只要实现这个接口就可以给Ribbon提供服务数据了?事实的确如此,在SpringCloud中,eureka、nacos等注册中心都实现了这个接口,都将注册中心的服务实例数据提供给Ribbon,供Ribbon来进行负载均衡。

通过名字也可以知道,是用来更新服务注册表的数据,他有唯一的实现,就是PollingServerListUpdater,这个类有一个核心的方法,就是start,我们来看一下start的实现。

通过这段方法我们可以看出,首先通过isActive.compareAndSet(false, true)来保证这个方法只会被调用一下,然后封装了一个Runnable,这个Runnable干了一件核心的事,就是调用传入的updateAction的doUpdate方法,然后将Runnable扔到了带定时调度功能的线程池,经过initialDelayMs(默认1s)时间后,会调用一次,之后都是每隔refreshIntervalMs(默认30s)调用一次Runnable的run方法,也就是调用updateAction的doUpdate方法。

所以这个类的核心作用就是每隔30s会调用一次传入的updateAction的doUpdate方法的实现,记住这个结论。

IRule是负责负载均衡的算法的,也就是真正实现负载均衡获取一个服务实例就是这个接口的实现。比如说实现类RandomRule,就是从一堆服务实例中随机选取一个服务实例。

就是一个配置接口,有个默认的实现DefaultClientConfigImpl,通过这个可以获取到一些配置Ribbon的一些配置。

这个接口的作用,对外主要提供了获取服务实例列表和选择服务实例的功能。虽然对外主要提供获取服务的功能,但是在实现的时候,主要是用来协调上面提到的各个核心组件的,使得他们能够协调工作,从而实现对外提供获取服务实例的功能。

这个接口的实现有好几个实现类,但是我讲两个比较重要的。

BaseLoadBalancer

核心属性

allServerList:缓存了所有的服务实例数据

upServerList:缓存了能够使用的服务实例数据。

rule:负载均衡算法组件,默认是RoundRobinRule

核心方法

setRule:这个方法是设置负载均衡算法的,并将当前这个ILoadBalancer对象设置给IRule,从这可以得出一个结论,IRule进行负载均衡的服务实例列表是通过ILoadBalancer获取的,也就是 IRule 和 ILoadBalancer相互引用。setRule(rule)一般是在构造对象的时候会调用。

chooseServer:就是选择一个服务实例,是委派给IRule的choose方法来实现服务实例的选择。

BaseLoadBalancer这个实现类总体来说,已经实现了ILoadBalancer的功能的,所以这个已经基本满足使用了。

说完BaseLoadBalancer这个实现类,接下来说一下DynamicServerListLoadBalancer实现类。DynamicServerListLoadBalancer继承自BaseLoadBalancer,DynamicServerListLoadBalancer主要是对BaseLoadBalancer功能进行扩展。

DynamicServerListLoadBalancer

成员变量

serverListImpl:上面说过,通过这个接口获取服务列表

filter:起到过滤的作用,一般不care

updateAction:是个匿名内部类,实现了doUpdate方法,会调用updateListOfServers方法

serverListUpdater:上面说到过,默认就是唯一的实现类PollingServerListUpdater,也就是每个30s就会调用传入的updateAction的doUpdate方法。

这不是巧了么,serverListUpdater的start方法需要一个updateAction,刚刚好成员变量有个updateAction的匿名内部类的实现,所以serverListUpdater的start方法传入的updateAction的实现其实就是这个匿名内部类。

那么哪里调用了serverListUpdater的start方法传入了updateAction呢?是在构造的时候调用的,具体的调用链路是调用 restOfInit -> (),这里就不贴源码了

所以,其实DynamicServerListLoadBalancer在构造完成之后,默认每隔30s中,就会调用updateAction的匿名内部类的doUpdate方法,从而会调用updateListOfServers。所以我们来看一看 updateListOfServers 方法干了什么。

这个方法实现很简单,就是通过调用 ServerList 的getUpdatedListOfServers获取到一批服务实例数据,然后过滤一下,最后调用updateAllServerList方法,进入updateAllServerList方法。

其实很简单,就是调用每个服务实例的setAlive方法,将isAliveFlag设置成true,然后调用setServersList。setServersList这个方法的主要作用是将服务实例更新到内部的缓存中,也就是上面提到的allServerList和upServerList,这里就不贴源码了。

其实分析完updateListOfServers方法之后,再结合上面源码的分析,我们可以清楚的得出一个结论,那就是默认每隔30s都会重新通过ServerList组件获取到服务实例数据,然后更新到BaseLoadBalancer缓存中,IRule的负载均衡所需的服务实例数据,就是这个内部缓存。

从DynamicServerListLoadBalancer的命名也可以看出,他相对于父类BaseLoadBalancer而言,提供了动态更新内部服务实例列表的功能。

为了便于大家记忆,我画一张图来描述这些组件的关系以及是如何运作的。

说完一些核心的组件,以及他们跟ILoadBalancer的关系之后,接下来就来分析一下,ILoadBalancer是在ribbon中是如何使用的。

ILoadBalancer是一个可以获取到服务实例数据的组件,那么服务实例跟什么有关,那么肯定是跟请求有关,所以在Ribbon中有这么一个抽象类,,这个是用来执行请求的,我们来看一下这个类的构造。

通过上面可以看出,在构造的时候需要传入一个ILoadBalancer。

中有一个方法executeWithLoadBalancer,这个是用来执行传入的请求,以负载均衡的方式。

这个方法构建了一个LoadBalancerCommand,随后调用了submit方法,传入了一个匿名内部类,这个匿名内部类中有这么一行代码很重要。

这行代码是根据给定的一个Server重构了URI,这是什么意思呢?举个例子,在OpenFeign那一篇文章我说过,会根据服务名拼接出类似 http:// ServerA 的地址,那时是没有服务器的ip地址的,只有服务名,假设请求的地址是 http:// ServerA/api/sayHello ,那么reconstructURIWithServer干的一件事就是将ServerA服务名替换成真正的服务所在的机器的ip和端口,假设ServerA所在的一台机器(Server里面封装了某台机器的ip和端口)是192.168.1.101:8088,那么重构后的地址就变成 http:// 192.168.1.101:8088/api/ sayHello ,这样就能发送http请求到ServerA服务所对应的一台服务器了。

之后根据新的地址,调用这个类中的execute方法来执行请求,execute方法是个抽象方法,也就是交给子类实现,子类就可以通过实现这个方法,来发送http请求,实现rpc调用。

那么这台Server是从获取的呢?其实猜猜也知道,肯定是通过ILoadBalancer获取的,因为submit方法比较长,这里我直接贴出submit方法中核心的一部分代码

就是通过selectServer来选择一个Server的,selectServer我就不翻源码了,其实最终还是调用ILoadBalancer的方法chooseServer方法来获取一个服务,之后就会调用上面的说的匿名内部类的方法,重构URI,然后再交由子类的execut方法来实现发送http请求。

所以,通过对的executeWithLoadBalancer方法,我们可以知道,这个抽象类的主要作用就是通过负载均衡算法,找到一个合适的Server,然后将你传入的请求路径 http:// ServerA/api/sayHello 重新构建成类似 http:// 192.168.1.101:8088/api/ sayHello 这样,之后调用子类实现的execut方法,来发送http请求,就是这么简单。

到这里其实Ribbon核心组件和执行原理我就已经说的差不多了,再来画一张图总结一下

说完了Ribbon的一些核心组件和执行原理之后,我们再来看一下在SpringCloud环境下,这些组件到底是用的哪些实现,毕竟有写时接口,有的是抽象类。

Ribbon的自动装配类:RibbonAutoConfiguration,我拎出了核心的源码

RibbonAutoConfiguration配置类上有个@RibbonClients注解,接下来讲解一下这个注解的作用

SpringClientFactory是不是感觉跟OpenFeign中的FeignContext很像,其实两个的作用是一样的,SpringClientFactory也继承了NamedContextFactory,实现了配置隔离,同时也在构造方法中传入了每个容器默认的配置类RibbonClientConfiguration。至于什么是配置隔离,我在OpenFeign那篇文章说过,不清楚的小伙伴可以后台回复feign01即可获得文章链接。

配置优先级问题

优先级最低的就是FeignContext和SpringClientFactory构造时传入的配置类

至于优先级怎么来的,其实是在NamedContextFactory中createContext方法中构建时按照配置的优先级一个一个传进去的。

RibbonClientConfiguration提供的默认的bean

接下来我们看一下RibbonClientConfiguration都提供了哪些默认的bean

配置类对应的bean,这里设置了ConnectTimeout和ReadTimeout都是1s中。

IRule,默认是ZoneAvoidanceRule,这个Rule带有过滤的功能,过滤哪些不可用的分区的服务(这个过滤可以不用care),过滤成功之后,继续采用线性轮询的方式从过滤结果中选择一个出来。至于这个propertiesFactory,可以不用管,这个是默认读配置文件的中的配置,一般不设置,后面看到都不用care。

至于为什么容器选择NacosServerList而不是ConfigurationBasedServerList,主要是因为这个配置类是通过@RibbonClients导入的,也就是比SpringClientFactory导入的RibbonClientConfiguration配置类优先级高。

ServerListUpdater,就是我们剖析的PollingServerListUpdater,默认30s更新一次BaseLoadBalancer内部服务的缓存。

那么在springcloud中,上图就可以加上注册中心。

三、总结

本文剖析了Ribbon这个负载均衡组件中的一些核心组件的源码,并且将这些组件之间的关系一一描述清楚,同时也剖析了在发送请求的时候是如何通过ILoadBalancer获取到一个服务实例,重构URI的过程。希望本篇文章能够让你知道Ribbon是如何工作的。

F. 易语言怎么查看已编辑程序的全部源码(包含对话框编辑框等的设定语句)

在程序的窗口界面按住鼠标左键拖出一个框选中全部组件(和选择一定区域的文件一个道理)然后右键复制,到新程序的空白窗口在粘贴,调整下位置,就全部复制过来了,程序集也一定要复制进对应的程序集哦~

以及查看组件的属性是在窗口里面直接编辑的,除非需要变化否则应该不会在程序集里面出现

G. 如何在Eclipse中查看JDK类库的源代码 (转载)

1.点 “window”-> "Preferences" -> "java" -> "Installed JRES"

2.此时"Installed JRES"右边是列表窗格,列出了系统中的 JRE 环境,选择你的JRE,然后点边上的 "Edit...", 会出现一个窗口(Edit JRE)

3.选中rt.jar文件的这一项:“c:program filesjavajre_1.5.0_06lib t.jar”
点 左边的“+” 号展开它,

4.展开后,可以看到“Source Attachment:(none)”,点这一项,点右边的按钮“Source Attachment...”, 选择你的JDK目录下的 “src.zip”文件

5.一路点"ok",结束。

dt.jar是关于运行环境的类库,主要是swing的包
tools.jar是关于一些工具的类库
rt.jar包含了jdk的基础类库,也就是你在java doc里面看到的所有的类的class文件

H. 如何在Eclipse中查看Android源码或者第三方组件包源码

1、用Eclipse查看,安卓实现源码时,会出现如下错误,Source not found,这是选择的开发包出错,或者,没有改函数的实现,一般都会有的,所以,大多是,选择的 SDK出现错误。这时候,你要找到,android包所在目录,最新Eclipse和以往的Eclipse有所差异。 2、点击按钮,点击,External Folder选择,sdk所在的文件件,大家注意地址的,选择,一定不能错。 3、出现,如图所示,operation in progress.....说明,成功了。

I. 怎么在windows下查看android源码

如何查看Android源码[以Android2.2为例]

我们知道在Eclipse里按住Ctrl键不松手在某个类上点击鼠标左键,可以跳转到该类的文件。如果没有源码就会跳到class文件上。因此我们只需要把源码拷贝到合适位置,Eclipse就可以找到源码了。接下来我说一下步骤:

把android-2.2-froyo-src.zip源码下载下来,[解压后]放在Android
SDK的指定目录下,在我机器上的目录是:C:/AndroidSDK/android-sdk-windows/platforms/android-
8/sources,其中sources目录是自己建的。解压后的情况应该是这样的:

在Javadoc For 'ormlite-android-4.22.jar'属性框中点击Browse按钮来选择帮助文档包,然后点击OK按钮。

第四:经过以上的操作步骤,就完成了对第三方组件源码的添加设置以及帮助文档的添加和设置。这样就可以和查看Android源码一样可以查看第三方组件的源码了,同时在Eclipse中把光标定位到某个类,按F1键就可以查看相应的帮助文档了。对ormlite-core-4.22.jar的操作也是一样。

阅读全文

与看一个组件源码相关的资料

热点内容
北京文件夹加密多少钱 浏览:669
什么是车鉴定app 浏览:64
战地一私人服务器怎么买 浏览:497
陈天程序员 浏览:833
编译原理如何运用到编程中 浏览:17
linux选择数据库 浏览:376
php两个数组差集 浏览:978
迷你pdf阅读器下载 浏览:433
做一个python小程序 浏览:655
pythonossystem和 浏览:645
win2008如何搭建ftp服务器 浏览:53
安卓手机为什么不翻牌 浏览:546
删除pkpm及相关文件夹 浏览:481
房贷解压银行内部流程 浏览:734
安卓手机如何更改语音 浏览:601
android红包实现 浏览:734
苹果的nvme为什么安卓不用 浏览:32
python输入单词统计个数 浏览:998
脚本软件提取源码 浏览:281
程序员能给自己的微信钱包刷钱么 浏览:73