首页 文章 精选 留言 我的

精选列表

搜索[静态编译],共10013篇文章
优秀的个人博客,低调大师

AngularDart部署为静态网页

建立build.yaml文件,并进行如下配置 targets: $default: builders: build_web_compilers|entrypoint: # These are globs for the entrypoints you want to compile. generate_for: - test/**.browser_test.dart - web/**.dart options: compiler: dart2js # List any dart2js specific args here, or omit it. dart2js_args: - -O0 在命令行执行如下命令 pub run build_runner build --output web:build -r 详细命令详解见如下命令工具dart2js: Dart-to-JavaScript compilerwebdev 部署

优秀的个人博客,低调大师

Pyright —— Python 静态类型检查工具

Pyright 是微软开发的一个 Python 代码类型检查工具。 Pyright 的速度是mypy 的 5 倍以上。Pyright 使用 TypeScript 开发,无需 Python 环境支持。 官方表示创建Pyright 是为了解决像 mypy这些已有的 Python 类型检查器的问题。有以下值得关注的特性: 速度快:Pyright 比使用 Python 编写的 mypy 和其他检查器普遍快5倍或更多。它适用于大型 Python 源码仓库,支持在“观察(watch)”模式下运行,并在修改文件时执行快速增量更新。 可配置:Pyright支持灵活的配置,提供了对设置的细粒度控制,可以为源码库的不同子集指定不同的“执行环境”。每个环境都可以指定不同的 PYTHONPATH 设置、Python 语言版本和目标平台。 不依赖 Python 环境:Pyright 使用 TypeScript 编写,它不需要安装 Python 环境或导入的第三方软件包。 Pyright 包含一个命令行工具和一个 VS Code 的Language Server Protocol插件。

优秀的个人博客,低调大师

JavaScript Object类的静态方法

ES5 使用指定的原型及属性创建一个新对象 Object.create(prototype)Object.create(prototype,descriptors) 创建或配置指定对象的某个属性 Object.defineProperty(object,name,desc) 创建或配置指定对象的一个或多个属性 Object.defineProperties(object,descriptors) 将指定对象设置为不可改变 (冻结对象) Object.freeze(object) 查询指定对象的指定属性的特性 Object.getOwnPropertyDescriptor(object,name) 返回一个包含指定对象的所有非继承属性名的数组,包括不可枚举属性 Object.getOwnPropertyNames(object) 返回指定对象的原型 Object.getPrototypeOf(object) 检查当前对象是否含有某个非继承的属性 Object.hasOwnProperty(propertyname) 检查当前对象是否能添加新属性 Object.isExtensible(object) 检查当前对象是否已冻结 Object.isFrozen(object) 简单指定对象是否为封闭的 Object.isSealed(object) 返回一个包含指定对象的所有能非继承可枚举属性名的数组 Object.keys(object) 组织向指定对象添加新的属性 Object.preventExtensions(object) 检测某个属性是否在for/in循环中可见(是否可枚举) Object.propertyIsEnumerable(propertyname) 阻止向指定对象添加新的属性或删除现有属性 Object.seal(object) 定义一个对象的字符串表示形式 Object.toString(object) 定义一个对象的本地化的字符串表示形式 Object.toLocaleString(object) 给定对象的原始值 Object.valueOf(object)Object.setPrototypeOf(child, parent)Object.getOwnPropertySymbols(o)Object.entries() ES6新增 Object.assign()Object.is()

优秀的个人博客,低调大师

从静态代理到动态代理

代理模式 代理模式是非常常见的设计模式,在功能增强方面使用的特别明显,例如数据库连接池会使用代理连接代理真实的物理连接,以达到close只是归还到池中而不是真实关闭的效果。 模式介绍 代理模式可以说是特别容易上手的一个模式,因为现实生活中就有很多的代理,理解起来相对是比较容易的。 图片描述 代理类实现了和实现类一样的接口 代理类依赖实现类 调用其实使用的是代理对象 模式优点和缺点 优点 当对现有功能增强的时候不需要修改已经实现的部分,只需要写代理类即可,满足了开闭原则。 缺点 当接口发生变化的时候,不但实现类要改动,代理类也要跟着改动。例如新增和修改了接口,代理类作为接口的实现类,也需要实现这些。 java的动态代理 动态代理的出现解决了模式的缺点 动态代理的简易展示 class TestInvocationHanlder implements InvocationHandler{ ITest target; public TestInvocationHanlder(ITest target) { super(); this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before"); method.invoke(target, args); System.out.println("after"); return null; } public static void main(String[] args) { TestInvocationHanlder hanlder =new TestInvocationHanlder(new TestImpl()); ITest newProxyInstance = (ITest) Proxy.newProxyInstance(Main.class.getClassLoader(),new Class[]{ITest.class} , hanlder); newProxyInstance.hello(); } 上面代码锁展示的部分就是一个动态代理的操作过程。 主要就是通过newProxyInstance产生代理对象。 InvocationHandler的作用 看了代码的人一个最大的疑问就是为什么调用的代码最后会走入到InvocationHandler的实现中去。 我们先来看看newProxyInstance是做了什么操作 public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException { final Class<?>[] intfs = interfaces.clone(); Class<?> cl = getProxyClass0(loader, intfs); final Constructor<?> cons = cl.getConstructor(constructorParams); final InvocationHandler ih = h; return cons.newInstance(new Object[]{h}); } 以上代码是去除了检验操作的部分,我们可以清晰的看到,这里是构造了一个cl的对象,并且把InvocationHandler 作为构造的参数传入的。 getProxyClass0是一个创造字节码并且类加载的过程。 我们可以通过ProxyGenerator看到动态字节码生成后的结果。 byte[] proxyClassFile = ProxyGenerator.generateProxyClass("Proxy", new Class[] { ITest.class }); Files.copy(new ByteArrayInputStream(proxyClassFile), Paths.get("F:\\code\\Proxy.class")); 使用如上代码,就可以生成一个名叫proxy的字节码文件 public final class Proxy extends java.lang.reflect.Proxy implements ITest { private static Method m1; private static Method m3; private static Method m2; private static Method m0; public Proxy(InvocationHandler paramInvocationHandler) { super(paramInvocationHandler); } public final boolean equals(Object paramObject) { return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue(); } public final void hello() { this.h.invoke(this, m3, null); return; } public final String toString() { return (String)this.h.invoke(this, m2, null); } public final int hashCode() { return ((Integer)this.h.invoke(this, m0, null)).intValue(); } static { m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") }); m3 = Class.forName("proxy.ITest").getMethod("hello", new Class[0]); m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]); m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]); } } 以上也是省去了部分代码的结果,我们看到proyx是一个继承了reflect并且实现了我们的接口的类,他的构造参数就是InvocationHandler ,我们可以看到里面的方法,都是直接用InvocationHandler 的invoke来调用的,具体的方法,上面的声明的method就是具体方法调用时,就是调用invoke传入的参数。 动态代理流程 java直接生成了一个实现接口的字节码,对应我们的代理类,然后具体的流程必须我们编写invocationhandler来调用,代理类就是调用invocationhandler,以此达到动态的效果。 图片描述 真实运行起来的效果就是上面的类图,只不过这个proxy是动态生成代理类的过程,由于代理类是根据接口动态生成的,所以在接口变化的时候,只要是逻辑没变的情况下,动态代理是不需要修改代码的。 总结 动态代理的本质就是动态生成代理类,他解决了接口变化带来的代码变化,例如接口新增了方法a,那么不用修改代码,代理就可以做到对a的增强。但是他无法解决对部分方法做增强的问题,例如原来的方法a,b,c,是对a是用a逻辑增强,对b有b逻辑增强。这块逻辑都要写在invocationhanlder的invok方法里,当遇到这种情况,修改invocationhandler是必须的了。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册