https 加解密的一些理解

客户端与服务端之间的通信为了保证通信过程安全一般会使用 https 传输数据,https 里既有用到非对称加密,也有用到对称加密。

具体来说,客户端与服务端协商用什么加密算法的过程是非对称加密的,在协商完成之后,它们之间传输的数据是用对称加密的。

西藏游记

西藏,新疆,内蒙是国内我最想去的三个地方,它们分别对应着雪山,沙漠和草原,这次凑了7天假,连着两个周末,总共十一天,和朋友一起去西藏逛了一圈。

由于只有十一天的时间,不算长,所以没有选择坐火车进藏,而是先从南京飞到重庆,再到重庆转机,飞到拉萨,目前国内能直飞拉萨的好像只有成都,重庆,西宁,西安了。进拉萨的机票不算贵,南京到重庆 300 多,重庆到拉萨 600 多,总共才 1000 多一点。但是有个很坑的地方是飞出拉萨的机票特别贵,回去时买的拉萨飞西安的就差不多 1700 。所以如果有时间的话,最好还是飞机进藏,火车出藏,这样既能欣赏到火车穿出青藏高原的沿路美景,还比较省钱。

java反射获得泛型参数getGenericSuperclass

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Person<T> {

}

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class Student extends Person<Student> {
public static void main(String[] args) {
Student st=new Student();
Class clazz=st.getClass();
//getSuperclass()获得该类的父类
System.out.println(clazz.getSuperclass());
//getGenericSuperclass()获得带有泛型的父类
//Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
Type type=clazz.getGenericSuperclass();
System.out.println(type);
//ParameterizedType参数化类型,即泛型
ParameterizedType p=(ParameterizedType)type;
//getActualTypeArguments获取参数化类型的数组,泛型可能有多个
Class c=(Class) p.getActualTypeArguments()[0];
System.out.println(c);
}
}

打印结果:

1
2
3
class com.test.Person
com.test.Person<com.test.Student>
class com.test.Student

java 动态代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// 代理的接口
public interface ManToolsFactory {
void saleManTools(String size);
}


public class AaFactory implements ManToolsFactory {
@Override
public void saleManTools(String size) {
System.out.println("按需求定制了一个size为"+size+"的model");
}
}

// 代理类
public class MarkCompany implements InvocationHandler {

/*持有的真实对象*/
private Object factory;

public Object getFactory() {
return factory;
}

public void setFactory(Object factory) {
this.factory = factory;
}

/*通过Proxy获得动态代理对象*/
public Object getProxyInstance(){
return Proxy.newProxyInstance(factory.getClass().getClassLoader(),
factory.getClass().getInterfaces(),this);
}

/*通过动态代理对象方法进行增强*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {


Object result = method.invoke(factory, args);
return result;
}


public class Client {

public static void main(String[] args) {
/*动态代理模式---------------*/
ManToolsFactory aafactory = new AaFactory();
MarkCompany markCompany = new MarkCompany();

markCompany.setFactory(aafactory);
ManToolsFactory employee1
= (ManToolsFactory)markCompany.getProxyInstance();
employee1.saleManTools("E");
}
}
1
2


java 线程池

为什么要使用线程池

1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。创建线程关闭线程花销是比较大的。

2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

Android Studio 导入classes.jar包

Android SDK 中有很多带有 @hide 注解的 api,这些API为系统隐藏的 api,上层应用无法直接调用。我们开发时如果必须使用有两种方式,一是利用java反射机制。二则是在我们项目中导入 Android 系统源码编译出的classes.jar 包,该 jar 包生成在out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar。这里我重点介绍Android Studio如何导入classes.jar.

Android 性能优化之布局优化

在Android应用开发中,常用的布局方式主要有LinearLayout、RelativeLayout、FrameLayout等,通过这些布局可以实现各种各样的界面。我们需要知道如何高效地使用这些布局方式来组织UI控件,布局的好坏影响到绘制的时间,本节将通过减少Layout层级减少测量绘制时间提高复用性三个方面来优化布局,优化的目的就是减少层级,让布局扁平化,以提高绘制的时间,提高布局的复用性节省开发和维护成本。

读《深入理解Java虚拟机》总结<三.java中的新生代和老年代内存>

概念

新生代:新生代中98%的对象都是朝生夕死 (1个eden 区(80%) 和 2个survivor区(10%))。
老年代:存活对象存留的时间比较久。

MinorGC:发生在新生代的垃圾回收。很频繁,速度快。
FullGC:发生在老年代的垃圾回收。发生FullGC通常会伴随一次MinorGC(并非绝对),FullGC会比MinorGc慢10倍以上。

|