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倍以上。

Android屏幕适配 px,dp,dpi及density的关系与深入理解

PX(pixel):

即传统计算机语言中描述的像素,在Android则代表绝对像素。

之所以Android中不推荐使用这种单位,正是因为不同生产厂商,不同品牌,不同屏幕的设备,其分辨率亦不一。

举例来说,我们现在将某个Button的width设为160px,则会出现如下情况:

在分辨率为“320宽”的设备里,该按钮显示占屏幕宽度一半;

在分辨率为“640宽”的设备里,该按钮显示占屏幕宽度的四分之一;

|