首页 文章 精选 留言 我的

精选列表

搜索[Java表达式],共10000篇文章
优秀的个人博客,低调大师

java代理模式

前言: 看有关于技术的文章需要带着问题去看,我上周在公司做了一场设计模式的技术分享,在会上又不同的小伙伴提出了很多疑问,那么今天我就来解决一下这一些疑问,非常感谢参与会议的小伙伴。 问题: 一、什么是设计模式? 二、为什么JDK动态代理与CGLIB动态代理生成的源代码是差不多的? 三、代理模式相比直接使用接口有什么好处吗? 四、如果接口被多个类实现会怎样? 问题1:什么是设计模式 设计模式是一种经验能够使新手更加简单的使用前人的经验和方案。 可以避免重复劳动,就像一句在这个行业流行的话不要重复造轮子。 设计模式是针对特定上下文的特定问题的解决方案,解决方案被抽象化、模版化、就是设计模式,学习设计模式的关键是理解,理解方法理解思想理解观念。 不是为了使用设计模式而,设计的根本是为了可复用、可拓展、高性能,不要为了使用设计模式而使用,一定要结合实际环境的去考虑整个问题。 每一种模式有四个基本元素:模式名称、问题描述、应用场景、应用后效果。 设计模式在应用中遵循六大原则: 开闭原则:对扩展开放,对修改关闭。 里氏代换原则:任何基类可以出现的地方,子类一定可以出现。 依赖倒转原则:针对接口编程,依赖于抽象而不依赖于具体。 接口隔离原则:使用多个隔离的接口,比使用单个接口要好。 迪米特法则:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。 合成复用原则:原则是尽量使用合成/聚合的方式,而不是使用继承。 代理模式分为两种:静态代理、动态代理,这两者有什么区别呢?往下看就明白了。 什么是代理模式:为其他对象提供一种代理以控制对这个对象的访问(例:AOP、拦截器)。 代理模式的角色:被代理者与代理者实现的接口、代理类、被代理类。 一、静态代理模式: 静态代理由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class就已经存在了。 UML图: 图中含有接口(person)、代理类(proxy)、被代理类(target),带代理者与代理者都实现了person的接口,client在调用时是直接访问的被代理类(proxy),代理类在buy方法中引用了targer类中的buy方法,可以在代理前、代理后做一些其他的业务逻辑处理,控制targer的访问。 下面直接上代码,一步步引出静态代理的优点与缺点: 接口: package proxyblogs; /** * 人的行为接口. */ public interface person { /** * 买东西. * * @param name 商品名称. * @return int * @author null */ int buy(String name); Target类(被代理者): package proxyblogs; /** * @ClassName Target. * Create by Null on 2019/2/26/19:29 **/ public class Target implements person { /** * 买东西. * * @param name 商品名称. * @return int 价格 * @author null */ @Override public int buy(String name) { if (name.equals("apple")) { return 5; } else { return 3; } } } proxy类(代理者): package proxyblogs; /** * @ClassName proxy. * Create by Null on 2019/2/26/19:30 **/ public class proxy implements person { /** * 买东西. * * @param name 商品名称. * @return int * @author null */ @Override public int buy(String name) { int buy = new Target().buy(name); //运费 int freight = 2; return buy + freight; } } test测试类 package proxyblogs; /** * @ClassName Test. * Create by Null on 2019/2/26/19:39 **/ public class Test { public static void main(String[] args) { int money = new proxy().buy("apple"); System.out.println(money); } } 执行结果: 7 Process finished with exit code 0 优点: 一、相对于动态代理来说,程序比较简易、性能比动态代理要高。 缺点: 一、静态代理类和被代理类实现了相同的接口,代理类通过被代理类实现了相同的方法。这样就出现了大量的代码重复,增加了代码维护的复杂度。 二、静态代理只服务于一种类型的对象, 如果要服务 多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模 稍大时就无法胜任了。

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

Java总结 - PriorityQueue

新年第一篇, 如果有错误请及时指正哈!! 祝大家新年快乐 嘻嘻 今天说一下PriorityQueue,这是一个有顺序的队列,此顺序并不是加入顺序,而是元素的按一定规则排列的顺序,我们看一下他的类图关系 相对于Deque,此实现就只是实现了关于Queue的相关接口,所以它就只能作为队列使用了.我们来稍微看一下用法Comparator<Integer> comparator = Comparator.comparingInt(x -> x); PriorityQueue<Integer> queue = new PriorityQueue<>(comparator); queue.add(7); queue.add(1); queue.add(10); queue.add(6); System.

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

Java总结 - ArrayDeque

这次来说一下ArrayDeque,我们先看一下他的类关系图,其中忽略掉了一些标记性接口 我们看一下类的定义public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Cloneable, Serializable {...} 从中我们可以看到他实现了Deque接口,那么Deque是实现了Queue<E>接口,如下是两个接口中的部分方法Queue: boolean add(E e); boolean offer(E e); E remove(); E poll(); E element(); E peek(); Deq

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

java json解析

关于json串的解析,有很多种方法,目前测出最方便最快的一个第三方jar包就是jackson。 1、需引用的jar有二:jackson-core-asl、jackson-mapper-asl。 2、使用:ObjectMapper mapper = new ObjectMapper(); json转bean: mapper. readValue(json, mybean.class); json转bean list:mapper.readValue(json, TypeFactory.collectionType(ArrayList.class,mybean.class)); bean转json: StringWriter sw = new StringWriter(); JsonGenerator gen = new JsonFactory().createJsonGenerator(sw); mapper.writeValue(gen, obj); sw.toString() 3、json串中有key为A,但指定转换的mybean中未定义属性A,会抛异常。处理:mapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false),加上这一条,就没问题了,正常转换。 4、默认的json串,如果key或value类型非字符串,需要加上双引号的,但有些json包转换出来的json串却不一定会带上双引号。使用jackson时,如果非字符串未加双引号,也会报错。处理:mapper.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true)。

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

Java SPI机制

0 很久没有写博客了,这一两个月基本上就是找工作——离职——入职。到今天基本上入职近一个月了,在看公司代码的时候发现使用到了SPI技术来进行解耦,这篇文章主要写下SPI的基本使用。 1. SPI基本概念 SPI的全名叫Service Provider Interface,其主要是针对厂商或者插件的。我的理解就是上层提供接口,我们需要去实现,并且上层只需要根据我们的配置文件即可拿到我们的实现类(反射获取)。 2. SPI代码 先看下目录结构: 目录结构 2.1 接口定义 定义一个接口IStudy: public interface IStudy { void study(); } 2.2 编写实现类 编写两个实现类NormalStudy和SuperStudy: public class NormalStudy implements IStudy { @Override public void study() { System.out.println("normal study"); } } public class SuperStudy implements IStudy { @Override public void study() { System.out.println("super study"); } } 2.3 创建com.nick.test.IStudy文件 在src目录下创建META-INF\services\com.nick.test.IStudy文件,并在文件中添加两个实现类: com.nick.test.NormalStudy com.nick.test.SuperStudy 2.4 测试 public class Test { public static void main(String[] args) { ServiceLoader<IStudy> searches = ServiceLoader.load(IStudy.class); Iterator<IStudy> iterator = searches.iterator(); while (iterator.hasNext()) { iterator.next().study(); } } } 2.5 输出 结果 3 原理简单分析 大致原理其实通过上面的示例应该都知道了:通过读取META-INF/services/com.nick.test.IStudy文件的内容来确定接口对应的实现类,最终通过反射来进行实现类的加载。 核心代码: try { Enumeration<URL> resource = Test.class.getClassLoader().getResources("META-INF/services/" + IStudy.class.getName()); while (resource.hasMoreElements()) { URL url = resource.nextElement(); InputStream inputStream = url.openStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8")); String s; while ((s = bufferedReader.readLine()) != null) { System.out.println(s); } } } catch (IOException e) { e.printStackTrace(); } 输出: com.nick.test.NormalStudy com.nick.test.SuperStudy 最后通过反射加载并创建对象即可,原理还是很简单的!

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

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

用户登录
用户注册