源码

谈谈ASM字节码框架在Spring源码的应用

你说的曾经没有我的故事 提交于 2019-12-26 12:23:56
什么是ASM? 引用ASM官方的介绍: ASM是一个通用的Java字节码操作和分析框架。它可以直接以二进制形式用于修改现有类或动态生成类。ASM提供了一些常见的字节码转换和分析算法,可以从中构建定制的复杂转换和代码分析工具。ASM提供了与其他Java字节码框架类似的功能,但主要关注性能。由于它的设计和实现尽可能小,速度尽可能快,因此非常适合在动态系统中使用(当然,也可以以静态方式使用,例如在编译器中)。 说白了就是我们可以通过使用ASM框架,来读取和修改.class文件。相比JDK反射技术来说,ASM提供了更方便的字节码读取方式,性能上也更加高效。 简单了解如何使用ASM框架 在ASM框架中有两个主要的类,一个是ClassVisitor,一个是ClassReader。 ClassReader接收一个输入流,读取.class文件时通过accept方法 回调 ClassVisitor的各类 visit开头 的方法; InputStream is = new BufferedInputStream ( resource . getInputStream ( ) ) ; ClassReader classReader = new ClassReader ( is ) ; classReader . accept ( visitor , ClassReader . SKIP_DEBUG )

java音乐播放器编写源码_java - JAVA

非 Y 不嫁゛ 提交于 2019-12-26 12:09:24
文章来源: 嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 本文实例为大家分享了java音乐播放器的具体代码,供大家参考,具体内容如下 源码: package baidu; import java.awt. ; import java.awt.event. ; import java.io. ; import java.util. ; import javax.swing. ; import javax.media.bean.playerbean. ; //这个包要用到JMF public class MP3 extends JFrame implements Runnable { public JLabel shijian; private JSlider sldDiameter; public MediaPlayer soumd1; public JButton playSound, loopSound, stopsound; public JButton tjian, shanc, baocun, duqu; public JPanel jp1, jp2, jp3, jp4; public JList jl; int zongmiao=0; public Vector vector, mingcheng; boolean fo = false,

HashMap源码记录1|火影凡酷

☆樱花仙子☆ 提交于 2019-12-26 12:07:58
前言:由于笔者所在的公司用的是jdk1.8,故该源码是针对1.8分析的。 首先:我们看一张长的很丑的HashMap的结构图: 再看看几个核心的常量: 复制代码 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 默认初始化容器大小,当自己指定容器大小时,必须为2的幂次方 static final int MAXIMUM_CAPACITY = 1 << 30; //容器的最大容量值 static final float DEFAULT_LOAD_FACTOR = 0.75f; //加载因子 static final int TREEIFY_THRESHOLD = 8; //把桶中链表转换为红黑树的阈值 static final int UNTREEIFY_THRESHOLD = 6; //把红黑树转换成链表的阈值 static final int MIN_TREEIFY_CAPACITY = 64; //最小的表容量使桶被树化,当表的容量小于该值时,先扩容解决hash冲突而不是树化 复制代码 putVal()方法: 复制代码 1 /** 2 * 实现Map.put和相关方法 3 * 4 * @param hash 根据key计算出来的hash值 5 * @param key 键 6 * @param value 值 7 *

ArrayList源码的 elementData.getClass() != Object[].class

做~自己de王妃 提交于 2019-12-26 09:52:57
/*--> */ /*--> */ 1. 放出源码 2. elementData与Object[]   elementData的定义如下 transient Object[] elementData; // non-private to simplify nested class access   请看如下代码 package test; public class UserTest2 { public static void main(String[] args) { User[] users = new User[]{ new User(1, "admin", "admin@qq.com"), new User(2, "maco", "maco@qq.com"), new User(3, "kitty", "kitty@163.com") }; Object[] target = users; System.out.println(target.getClass()); // class [Ltest.User; target[0] = new Object(); // java.lang.ArrayStoreException: java.lang.Object } }   显然直接将非Object[]类型数组赋予Object[]类型, 相当于将子类对象赋予父类变量,

JDK8源码解析 -- HashMap(二)

半腔热情 提交于 2019-12-26 08:52:57
在上一篇 JDK8源码解析 -- HashMap(一) 的博客中关于HashMap的重要知识点已经讲了差不多了,还有一些内容我会在今天这篇博客中说说,同时我也会把一些我不懂的问题抛出来,希望看到我这篇博客的大神帮忙解答困扰我的问题,让我明白一个所以然来。彼此互相进步,互相成长。HashMap从jdk7到jdk8版本改变大,1.新增加的节点在链表末尾进行添加 2.使用了红黑树。 1. HashMap容量大小求值方法 // 返回2的幂次 static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; } (1)为什么这里需要 int n = cap - 1这样呢? 首先我们要明白这个方法的作用是获取输入容量大小最近的2的幂次值。假设你传过来的参数cap是16的话,经过下面的运算得出来的值为32,而不是16。所以这里需要减去一。这样才能获此值最小的2幂次值。 (2)这里左移之和为31=1+2+4+8+16,这里为什么是31呢? 这里容量大小是int的类型

Java源码阅读之:AtomicInteger

喜欢而已 提交于 2019-12-26 07:43:47
AtomicInteger源码分析 Top:带着问题看源码 在这周之前对原子类毫无了解,前面看了Unsafe类,对CAS操作有了一点了解。所以看AtomicInteger时的问题很简单,弄清楚它是什么类,有什么作用。 参考: 彤哥读源码 https://mp.weixin.qq.com/s/DdwSC5bYgFCWwnb0jxkspg 一:简介 AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。 原子操作 原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。 原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征。 我们这里说的原子操作与数据库ACID中的原子性,彤哥认为,数据库中的原子性主要运用在事务中,一个事务之内的所有更新操作要么都成功,要么都失败,事务是有回滚机制的,而这里说的原子操作是没有回滚的,这是最大的区别。 二:源码解析 总的来说,源码还是很简单的,很容易理解。提供原子操作主要是利用Unsafe类中的CAS方法。 属性 // 获取Unsafe实例 private static final Unsafe unsafe =

Java集合---LinkedList源码解析

﹥>﹥吖頭↗ 提交于 2019-12-26 02:32:36
Java集合---LinkedList源码解析 一、源码解析 1、 LinkedList类定义 2、LinkedList数据结构原理 3、私有属性 4、构造方法 5、元素添加add()及原理 6、删除数据remove() 7、数据获取get() 8、数据复制clone()与toArray() 9、遍历数据:Iterator() 二、ListItr 一、源码解析 1、 LinkedList类定义。 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 LinkedList 实现 List 接口,能对它进行队列操作。 LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。 LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。 LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。 LinkedList 是非同步的。

Spring Boot之源码分析篇-SpringMVC视图渲染过程

Deadly 提交于 2019-12-26 02:16:15
Spring Boot之源码分析篇-SpringMVC视图渲染过程 视图渲染过程:从前端到后台 DispatcherServlet入口 DispatcherServlet#Render(ModelAndView,request,response)方法 View#render(model,request,response)方法 ViewResolver视图解析器 AbstractCachingViewResolver#resolveViewName(viewName,locale) ContentNegotiatingViewResolver#resolveViewName(viewName,locale) 从不剑走偏锋,只会贱走源码 spring-boot-version:2.2.0.RELEASE 视图渲染过程:从前端到后台 SpringMVC流程架构图: 按照一般思考的流程,这里直接从DispatcherServlet前端控制器的方法render()开始分析。 DispatcherServlet入口 init():DispatcherServlet 继承FrameworkServlet;而FrameworkServlet继承HttpServletBean,并实现 了ApplicationContextAware接口,HttpServletBean实现init()方法,加载web

Arrays.sort(Object[] a)源码分析

ε祈祈猫儿з 提交于 2019-12-26 02:07:46
前言 Arrays.sort(Object[] a) 是Arrays的一个非常重要的一个静态方法,可以对数组的进行排序,前提是数组中的元素必须实现了 Comparable 接口。所用的排序方法为归并排序法;作为集合排序的核心,非常重要。 归并排序 归并排序的一个主要的优点:稳定,即 不需要交换相同的元素 。 举例 :假设有一个已经按照姓名排列的员工列表。现在,按照工资再按照工资排序。如果两个员工的工资相等会发生什么样的情况呢?如果采用稳定的排序算法,将会保留按名字排序的顺序。换句话说,排序的结果将会产生这样一个列表, 首先对按照工资排序,工资相同者再按照名字排序 。 源码分析 源码一(sort(Object[] a)) static final class LegacyMergeSort { private static final boolean userRequested = java.security.AccessController.doPrivileged( new sun.security.action.GetBooleanAction( "java.util.Arrays.useLegacyMergeSort")).booleanValue(); } public static void sort(Object[] a) { if (LegacyMergeSort

SpringMVC源码(三)- DispatcherServlet请求分析

只愿长相守 提交于 2019-12-26 01:10:12
目录 一、service请求(servlet请求转换为Http请求) 二、doService请求(request中添加SpringMVC初始化的九大件信息) 三、doDispatch HandlerExecutionChain结构和HandlerInterceptor方法调用 一、service请求(servlet请求转换为Http请求) DispatcherServlet作为一个Servlet,那么当有请求到Tomcat等Servlet服务器时,会调用其service方法。再调用到其父类 GenericServlet 的service方法,HttpServlet中实现,如下(开始请求的调用): @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { HttpServletRequest request; HttpServletResponse response; try { request = (HttpServletRequest) req; response = (HttpServletResponse) res; } catch (ClassCastException e) { throw new