提供api方法取得类的结构
提供api方法取得类的结构
引用自Java 反射
动态语言动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如众所周知的ECMAScript(JavaScript)便是一个动态语言。除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态语言。(引自: 百度百科)
12var execString = "alert(Math.floor(Math.random()*10));";eval(execString);
Class反射机制
指的是可以于运行时加载,探知和使用编译期间完全未知的类。
程序在运行状态中, 可以动态加载一个只有名称的类, 对于任意一个已经加载的类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能调用他的任意一个方法和属性。
加载完类之后, 在堆内存中会产生一个Class类型的对象(一个类只有一个Class对象), 这个对象包含了完整的类的结构信息,而且这个Class对象就像一面镜子,透过这个镜子看到类的结构,所以被称之为:反射。
Instances ...
正则表达式
正则表达式Java中的正则表达式正则表达式定义了字符串的模式,可以用来搜索、编辑或处理文本。
在Sun的Java JDK 1.4版本中,Java自带了支持正则表达式的包,位于java.util.regex,该包主要包括以下三个类:
Pattern类:Pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法。要创建一个Pattern对象,必须要调用其公共静态的compile方法,它返回一个Pattern对象。该方法接收一个正则表达式作为它的第一个参数。
Matcher类:Matcher对象是对输入字符串进行解释和匹配操作的引擎。与Pattern类一样,Matcher也没有公共构造方法,需要调用Pattern对象的matcher方法来获得一个Matcher对象。
PatternSyntaxException类:PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
Matcher类的常用方法:
matches():返回整个目标字符串与Pattern是否匹配
find():返回与Pattern匹配的下一个子串 ...
类与对象
类与对象Java作为一种面向对象语言,支持以下基本概念:
1多态、继承、封装、抽象、类、对象、实例、方法、重载
类:类是一个模板,它描述一类对象的行为和状态。
对象:对象是类的一个实例,有状态和行为。
Java中的对象对象的状态就是属性,行为通过方法体现。方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。
Java中的类类可以看成是创建Java对象的模板。一个类可以包含以下类型变量:
局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
成员变量:成员变量是定义在类中、方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。
构造方法每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器会为该类提供一个默认构造方法。在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。类的构造方法中可以调用该类的另外一个构造方法。
线程优先级
线程优先级在操作系统中,线程可以划分优先级,优先级较高的线程得到的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务。
设置线程优先级有助于帮”线程规划器”确定下一次选择哪一个线程来优先执行。
设置线程的优先级使用setPriority()方法,此方法在JDK的源码如下:
12345678910111213public final void setPriority(int newPriority) { ThreadGroup g; checkAccess(); if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) { throw new IllegalArgumentException(); } if((g = getThreadGroup()) != null) { if (newPriority > g.getMaxPriority()) { newPr ...
线程状态
线程状态
引用自Java 多线程干货系列(1)
线程与进程
线程:进程中负责程序执行的执行单元。线程本身依靠程序进行运行。线程是程序中的顺序控制流,只能使用分配给程序的资源和环境。
进程:执行中的程序。一个进程至少包含一个线程。
单线程:程序中只存在一个线程,实际上主方法就是一个主线程。
多线程:在一个程序中运行多个任务,目的是更好地使用CPU资源。
线程的状态线程的状态有以下几种:
创建状态(new):准备好了一个多线程的对象
就绪状态(runnable):调用了start()方法,等待CPU进行调度
运行状态(running):执行run()方法
阻塞状态(blocked):暂时停止执行,可能将资源交给其它线程使用
终止状态(dead):线程销毁
当需要新起一个线程来执行某个子任务时,就创建了一个线程。但是线程创建之后,不会立即进入就绪状态,因为线程的运行需要一些条件(比如内存资源),只有线程运行需要的所有条件满足了,才进入就绪状态。
当线程进入就绪状态后,不代表立刻就能获取CPU执行时间,也许此时CPU正在执行其它的事情,因此它要等待。当得到CPU执行时 ...
继承与实现
继承与实现
引用自Java接口实现和继承关系
抽象类有时候,我们可能想要构造一个很抽象的父类对象,它可能仅仅代表一个分类或抽象概念,它的实例没有任何意义,因此不希望它被实例化。
在Java中,通过在class关键字前增加abstract修饰符,就可以将一个类定义成抽象类。抽象类不能被实例化。
抽象类除了能像普通类一样可以拥有一般的属性和方法,也可以拥有抽象方法(abstract method)。抽象方法与抽象的行为相对应,通常是这个行为对父对象没有意义,而子对象有具体动作。抽象类可以有抽象方法也可以没有抽象方法;但是如果一个类有抽象方法,那么这个类只能定义为抽象类。
抽象方法还有一个特点是,它强迫子类要么仍然保持抽象性(即不具体实现该方法并仍然定义为抽象类),要么具体表现出这个方法的行为(实现具体的动作或者通过抛出UnsupportedOperationException异常来表明不支持该行为)。这样也可以强化多态性。
接口Java适用关键字interface定义一个接口。接口也是抽象对象,并且接口中的方法都是抽象方法。
一个接口可以继承其他接口;一个类通过关键字implements ...
调用类的方法
调用类的方法
引用自 深入分析Java方法反射的实现原理
方法反射实例1234567891011121314public class ReflectCase { public static void main(String[] args) throws Exception { Proxy target = new Proxy(); Method method = Proxy.class.getDeclaredMethod("run"); method.invoke(target); } static class Proxy { public void run() { System.out.println("run"); } }}
通过Java的反射机制,可以在运行期间调用对象的任何方法,如果大量使用这种方式进行调用,会有性能或内存隐患么?为了彻底 ...
转换流
转换流
初始化变量
1private static final String FILENAME = "E:" + File.separator + "hello.txt";
字节输出流转换为字符输出流12345678910private static void testWriter() { File file = new File(FILENAME); try { Writer writer = new OutputStreamWriter(new FileOutputStream(file)); writer.write("Today is sunday."); writer.close(); } catch (IOException e) { e.printStackTrace(); }}
字节输入流转换为字符输入流12345678910111213private static ...
运算符
运算符
引用自Java 运算符
Java中提供的运算符可以分为以下几组:
算术运算符
关系运算符
位运算符
逻辑运算符
赋值运算符
其他运算符
算术运算符示例:A = 10, B = 20
运算符
描述
示例
+
加法 - 运算符两侧的值相加
A + B 等于 30
-
减法 - 左操作书减去右操作数
A - B 等于 -10
*
乘法 - 操作符两侧的值相乘
A * B 等于 200
/
除法 - 左操作数除以右操作数
B / A 等于 2
%
取模 - 左操作数除以右操作数的余数
B % A 等于 0
++
自增 - 操作数的值加1
B++ 或 ++B 等于21
–
自减 - 操作数的值减1
B– 或 –B 等于19
前缀自增自减(++a, –a):先进行自增或自减运算,再进行表达式运算。
后缀自增自减(a++, a–):先进行表达式运算,再进行自增或自减运算。
关系运算符示例:A = 10, B = 20
运算符
描述
示例
==
...
选择与循环语句
选择与循环语句选择语句if语句一个if语句包含一个布尔表达式和一条或多条执行语句。
123if (布尔表达式) { // 如果布尔表达式为true将执行的语句}
如果布尔表达式的值为true,则执行if语句中的代码块,否则执行if语句块后面的代码。
if…else语句if语句后面可以跟else语句,当if语句的布尔表达式值为false时,else语句块会被执行。
12345if (布尔表达式) { // 如果布尔表达式为true将执行的语句} else { // 如果布尔表达式为false将执行的语句}
if…else if…else语句if语句后面可以跟else if…else语句,这种语句可以检测到多种可能的情况。使用该语句的时候,需要注意:
if语句最多有1个else语句,else语句在所有的else if语句之后。
if语句可以有若干个else if语句,它们必须在else语句之前。
一旦其中一个else if语句检测为true,其他的else if以及else语句都将跳过执行。
123 ...
重载与覆盖
重载与覆盖重载重载(overloading)是在一个类里面,方法名称相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(包括构造方法)都必须有一个独一无二的参数类型列表。
重载规则:
被重载的方法必须改变参数列表(参数个数或类型不一样)。
被重载的方法可以改变返回类型。
被重载的方法可以改变访问修饰符。
被重载的方法可以声明新的或更广的检查异常。
方法能够在同一个类中或者在一个子类中被重载。
无法以返回值类型作为重载方法的区分标准。
覆盖(又称重写)覆盖(Override)是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。
覆盖的好处在于子类可以根据需要,定义特定于自己的行为,也就是说子类能够根据需要实现父类的方法。
覆盖方法不能抛出新的检查异常或者比被覆盖方法声明更加宽泛的异常。
覆盖规则:
参数列表必须完全于被覆盖方法的相同。
返回类型必须完全于被覆盖方法的返回类型相同。
访问权限不能比父类中被覆盖的方法的访问权限更低。例如:如果父类的一个方法被声明为public,在子类中覆盖该方法就不能声明为protected。
父类 ...
JVM参数
JVM参数JVM参数
-Xms
堆最小值
-Xmx
堆最大值。-Xms与-Xmx的单位默认字节都是以k、m做单位的。通常着两个配置参数相等,避免每次空间不足,动态扩容带来的影响。
-Xmn
新生代大小
-Xss
每个线程池的堆栈大小。在jdk5以上的版本,每个线程堆栈大小为1m,jdk5以前的版本是每个线程池大小为256k。一般在相同物理内存下,如果减少 -Xss 值会产生更大的线程数,但不同的操作系统堆进程内线程数是有限制的,不能无限生成。
-XX:NewRatio
设置新生代与老年代比值,-XX:NewRatio=4 表示新生代与老年代所占比例为 1:4,新生代占比整个堆的五分之一。如果设置了-Xmn的情况下,该参数是不需要再设置的。
-XX:PermSize
设置持久代初始值,默认是物理内存的64分之一
-XX:MaxPermSize
设置持久代最大值,默认是物理内存的四分之一
-XX:MaxTenuringThreshold
新生代中对象存活次数,默认是15。(若对象再eden区,经历一次MinorGC后还活着,则被移动到Survivor ...
JVM调优
JVM调优
如何优化Java GC
大型跨境电商 JVM 调优经历
Jvm知识汇总
海量连接服务端jvm参数调优杂记
内存结构
内存结构
JVM内存结构
java8 去除永久代增加元数据区Metaspace
虚拟机运行时的数据区
程序计数器(program counter register),一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。由于Java虚拟机是采用多线程,通过线程切换获得时间片得到cpu的控制权。为了线程切换后能恢复到正确的执行位置。
虚拟机栈,调用一个方法时会创建一个栈帧,用于存储局部变量、对象引用、方法返回值,每一个方法从调用到执行完成,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。通过 -Xss 控制大小,如果线程请求的栈深度大于虚拟机所允许的深度,会抛出StackOverflowError。通过递归死锁会引发这种问题。
本地方法栈,与虚拟机栈相似,主要是针对native方法服务。
堆(heap),所有线程共享,通过new操作产生对象,存放对象实例,分为年轻代(eden、两个survivor)和年老代,通过 -Xmx 和 -Xms 控制大小,如果内存不足会抛OutOfMemoryError。通过GC释放。
方法区:主要是类信息、常量、静态变量,也叫持久代,通 ...
垃圾回收
垃圾回收
GC算法 垃圾收集器
Java GC 分析
Java应用频繁FullGC分析
GC日志
快速解读GC日志
CMS垃圾回收器详解
系统架构探索
架构图系统架构
LB(负载均衡)负载均衡选型 NginxRPC 【待定,需参考实际使用场景】RPC框架选型 gPRCgPRC适合服务间通信的场景,无需与前端应用进行交互,适用于当前的系统架构。
gRPC文档
服务治理框架选型 etcd
服务发现
强一致性、高可用的服务存储目录。基于Raft算法的etcd本身就是一个强一致性高可用的服务存储目录。
注册服务和监控服务健康状态的机制。可以在etcd中注册服务,并且对注册的服务设置key TTL,定时保持服务的心跳以达到监控健康状态的效果。
查找和连接服务的机制。通过在etcd指定的主题下注册的服务也能在对应的主题下查找到。为了确保连接,我们可以在每个服务机器上都部署一个proxy模式的etcd,这样就可以确保能访问etcd集群的服务都能互相连接。
配置中心
应用中用到的一些配置信息放到etcd上集中进行管理。应用在启动的时候主动从etcd获取一次配置信息,同时,在etcd节点上注册一个watcher并等待,以后每次配置有更新的时候,etcd都会实时通知订阅者,以此达到获取最新配置信息的目的。
分布式通知与协调
低耦合的心 ...
查找算法
顺序查找
思想: 这是最简单的算法,从头开始遍历每个元素,并将每个元素与查找元素比较,如果一致则返回。
时间复杂度: O(n)
空间复杂度: O(1)
代码示例:
1234567891011public int search(int[] array, int num) { if (array == null || array.length == 0) { return -1; } for (int i = 0; i < array.length; i++) { if (array[i] == num) { return i; } } return -1;}
二分查找
思想: 二分查找前提是查找的数组是有序的,利用数据有序的特性提高查找性能。首先与数组中间位置的值比较,如果查找值大于中间位置值,则对数组右边以相同的思路查找,否则在左边以相同方式查找。这种方式使得每次查找范围变为原来的1/2 ...
一套摆脱疲劳的自救指南
原文地址:一套摆脱疲劳的自救指南 转载
最近和朋友聊天,大家都有这么一个感触:
随着年龄增长,一方面,身体开始出现小问题。以前深夜工作是家常便饭,现在稍微睡得晚一点,第二天一定会头痛。
另一方面,精神状态也开始走下坡路。经常会时不时走神,忘了在做什么,一天下来总会精疲力尽。有时明明有大把时间,却什么都不想做,对什么事都提不起兴趣,就想静静瘫着,让时间给「消磨」掉……
知乎有一个经典的问题,叫做:为什么那么多人开车回家,到楼下了不下车还要在车里坐好久?
下面的回答参差百态。有描述中年男人生活压力的,有嗟叹柴米油盐、家长里短的,有倾诉家庭主妇每日忙碌烦琐的,也有身在不同行业、对目标和生涯的焦虑感……总而言之,就是一个字:累。
这似乎已经成为我们这一代人的共同感受。
无论收入高低,无论工作是否满意,家庭是否和睦,似乎很少有人,能够逃脱生活的疲劳感。
它就像一只虫子,无孔不入,蚕食着我们的效率和幸福感。
我很喜欢一个比喻:生活就像一场抛接球的杂耍。这些球,有的叫做家庭,有的叫做工作,有的叫做事业,有的叫做健康……
你要做的,就是尽量让它们,不要落地。
这当然很不容易。一开始,你很容易手 ...
优秀工程师必备的一项技能,你解锁了吗?
原文地址:优秀工程师必备的一项技能,你解锁了吗? 转载
阿里妹导读:很多程序员在工作一段时间后会遇到迷茫期,虽有技术傍身,也难免会产生焦虑,反复思考怎样才能快速成长。关于如何提高自己的思考力,运用思考的力量推动能力提升,以此实现技术成长,阿里巴巴盒马产品技术部的岩动总结了一套思考方法,分享给每个正在成长的程序员。(本篇文章较长,阅读时间约30分钟,建议收藏后,找一个合适的时间慢慢品读哦)
引言我们来看一下几类在程序员成长、发展的常见问题,如果你或多或少存在一些,那么恭喜你,这篇文章值得你仔细往下看了:
你自认为付出了跟别人同样的努力,但是你的成长确实更慢一些,比如学得比别人慢,排查问题比别人慢,出方案老是有漏洞等等;
你觉得你只是在疲于应付需求,自己做的事情完全没有技术含量(很多人觉得自己做的业务开发就是没有技术含量,但我认为每个领域都有自己的技术含量,只是你有没有get到);
你发现总是在犯同样的错误,或者做的事情不断地在同一个水平循环;
每次要晋升的时候,你发现根本讲不出来(很多人会认为是表达能力问题,但是我认为不是);
当你换到一个新的领域,你发现自己的经验好像用不上 ...
我的京东管理生涯随想
原文地址:我的京东管理生涯随想 转载
一、写在前面在京东的任职生涯马上就要结束了,回想起来,从16年校招加入京东,到今年年初离职,在这三年左右的时间里,京东在飞速的发展和变化,我也从一个刚入职场的初级后台开发成长为现在带着十来个人团队的小组长。这几年遇到了很多事,认识了很多人,也学会了很多道理,无论是技术水平还是管理能力都得到了很大的锻炼和提升。
近来无事,正好总结一下这几年工作,特别是团队管理方面的几点感悟和体会,一来方便日后翻阅,二来要是能够给大家带来一些有意义的参考和借鉴,那也是极好的。
二、回顾这几年在京东飞速发展和变化的大环境下,总是充满了机遇和挑战。一个想法从提出到落地,再到发展为一个重点项目,整个过程都是极快的。当然了,前提一定是这个想法要有价值并得到领导的认可和支持。
16年校招加入京东时,我有幸加入了一个业务覆盖范围迅速扩大、领导高度重视、组员都非常nice的高速成长、极具潜力的项目组。更加幸运的是,我加入时整个项目在经历了几次电商大促的考验后已经日渐趋于稳定,正处于业务覆盖范围迅速扩大、系统承载流量高速增长的关键阶段。在这关键阶段,最为重要的事情除了保证业务需 ...