残页

Results 143 comments of 残页

问题内容:什么是volatile关键字? 所属范围:多线程 出现频率:★★ 困难指数:★★ 参考答案:https://zhuanlan.zhihu.com/p/56191979

问题内容:什么是 Java 注解? 所属范围:Java基础 备注:注解,不是注释!!

问题内容:什么是Java中的泛型?使用泛型相比强转的好处的什么? 所属范围:Java基础

问题内容:HashMap,ArrayMap,IdentityHashMap,Hashtable,ConcurrentHashMap,EnumMap,SparseArray/LongSparseArray的区别? 所属范围:集合框架

问题内容:Android给我们提供了一个叫 LruCache 的缓存类,那么,什么是 LRU 算法? 所属范围:算法

问题内容:更改线程优先级可以使用Thread类的setPriority(int)方法,也可以用android.os.Process的setThreadPriority(int),那么两者之间是什么关系? 所属范围:Android 出现频率:★ 困难指数:★★ 参考答案: 为了这个问题我特意去看过源码。 Thread的setPriority方法是把参数保存到了成员变量priority里,如果此线程在工作,调用nativeSetPriority方法,这个方法会把Thread类定义的那些线程优先级转换为linux的优先级,然后如果设置为background级别,或从background修改到非background,调用set_sched_policy设置调度策略,最后调用linux的setpriority来设置。 Process的setThreadPriority直接就是个native方法,一路追踪下来最后还是调用的set_sched_policy和setpriority,不同的是没有转换(传进来的参数直接就是linux的优先级) 还剩下一个问题,设置了优先级,获取的时候结果是什么? Thread的getPriority方法直接返回了成员变量priority,所以通过Process.setThreadPriority设置不会反映到这里 Process的getThreadPriority方法返回的是getpriority的结果,所以通过Thread.setPriority设置之后也会反映到这里

因为没说是什么JVM,这里假设hotspot **因为我也是小白,不保证正确** 1.当要使用类时,JVM会判断此类是否已被加载到当前环境里,没有则会调用当前环境的ClassLoader.loadClass获得类 2.一般情况下,ClassLoader先尝试查找当前ClassLoader已加载的类,找不到则委托给父ClassLoader,通过双亲委派机制一层一层的往上传递,直到BootClassLoader(当然不一定要遵守此规则) 3.如果父ClassLoader无法加载此类,调用findClass方法加载,此时进入正题 4.findClass去找对应的.class文件(android里是去dex文件里找对应的类),找不到就抛ClassNotFoundException,然后加载到内存中 5.加载到内存中以后,首先校验格式(比如.class文件默认有8个字节的魔术字等),然后判断是否需要链接 6.如果需要链接,对类进行解析及初始化,比如初始化静态变量,初始化静态方法,执行静态代码块等,此阶段发生异常会引发LinkageError/ExceptionInInitializerError 7.如果走到这里一切都好,类加载的很成功,就返回Class,否则加载失败 参考资料:[JVM规范-类的加载,链接和初始化](https://docs.oracle.com/javase/specs/jvms/se12/html/jvms-5.html) 最后,五一快乐

@ADrunkenLiBai 回答你那个问题: 在JVM规范里,任何能够加载与执行Java 字节码(即class文件)的虚拟机都能叫JVM 但是Dalvik VM略有不同,其并没有完全遵守JVM规范,比如它不能执行class,只能加载dex文件格式(个人推测是害怕侵权?)

刚好之前研究过热修复,说下自己的观点: 热修复分为三个部分,分别是Java代码部分热修复,Native代码部分热修复,还有资源热修复。 资源部分热更新直接反射更改所有保存的AssetManager和Resources对象就行(可能需要重启应用) Native代码部分也很简单,系统找到一个so文件的路径是根据ClassLoader找的,修改ClassLoader里保存的路径就行(可能需要重启应用) Java部分的话目前主流有两种方式,一种是Java派,一种是Native派。 - java派:通过修改ClassLoader来让系统优先加载补丁包里的类 代表作有腾讯的tinker,谷歌官方的Instant Run,包括multidex也是采用的这种方案 优点是稳定性较好,缺点是可能需要重启应用 - native派:通过内存操作实现,比如方法替换等 代表作是阿里的SopHix,如果算上hook框架的话,还有dexposed,epic等等 优点是即时生效无需重启,缺点是稳定性不好: 如果采用方法替换方式实现,假如这个方法被内联/Sharpening优化了,那么就失效了;inline hook则无法修改超短方法。 热修复后使用反射调用对应方法时可能发生IllegalArgumentException。

WebView? - java调js: 可以用loadUrl指定 javascript: 协议,然后带上js代码,如 `webView.loadUrl("javascript:alert('hello!')")` 4.4以后还提供了一个execJavascript方法,更方便调用 - js调java: 可以先写好一个互调接口类,用addJavascriptInterface绑定好,然后js代码里调用 注意:api17以后希望被js调用的需要添加@JavascriptInterface注解,因为api17以前存在漏洞,通过互调接口的getClass()方法可以拿到Class对象,之后通过Class.forName()等一系列反射api可以调用任何方法 也可以在java层通过shouldOverrideUrlLoading拦截跳转请求,js代码里通过跳转页面传递给java