前言:
泛型怎么学习?有什么好方法?我这里没有!我学泛型的方法就是用起来.看到自己代码里有重复的方法...,那就想办法提取.多写多尝试.
泛型的知识点这个博文https://blog.csdn.net/s10461/article/details/53941091写得不错,直接上例子:
一同学里发来一份代码,说有好几个方法都是重复的,能不能帮忙反射提取一下.代码如下:
public class Tool {
public static Map<String, User> mapD = new HashMap<String, User>();// 用户
public static Map<String, OtherMachine> mapT = new HashMap<String, OtherMachine>();// 设备
public static Map<String, Factory> mapF = new HashMap<String, Factory>();
public static Map<String, Product> mapP = new HashMap<String, Product>();
// 一,遍历用户链表
public static Vector<Vector<String>> iterator() throws IOException {
Vector<Vector<String>> s = new Vector<Vector<String>>();
Iterator<Entry<String, User>> it = mapD.entrySet().iterator();
while (it.hasNext()) {
Entry<String, User> entry = it.next();
Vector<String> v = new Vector<String>();
v.add(entry.getValue().getID());
v.add(entry.getValue().getName());
v.add(entry.getValue().getNumber());
v.add(entry.getValue().getPower());
s.add(v);
}
return s;
}
// 二,遍历产品链表
public static Vector<Vector<String>> iteratorP() throws IOException {
Vector<Vector<String>> s = new Vector<Vector<String>>();
Iterator<Entry<String, Product>> it = mapP.entrySet().iterator();
while (it.hasNext()) {
Entry<String, Product> entry = it.next();
Vector<String> v = new Vector<String>();
v.add(entry.getValue().getName());
v.add(entry.getValue().getSize());
v.add(entry.getValue().getType());
v.add(entry.getValue().getDescription());
s.add(v);
}
return s;
}
//三 遍历设备链表
//四遍历工厂链表
}
既然指明要用反射,那就先来一版反射的.
public static <T> List<List<String>> iterator3(Map<String, T> map, Class<T> clazz) throws Exception {
List<List<String>> outerlist = new ArrayList<>();
Iterator<Entry<String, T>> it = map.entrySet().iterator();
Method[] methods = clazz.getMethods();
while (it.hasNext()) {
List<String> inerlist = new ArrayList<>();
Entry<String, T> entry = it.next();
T t = entry.getValue();
for (Method method : methods) {
String name = method.getName();
if (name.startsWith("get") && !name.equals("getClass")) {
Object invoke = method.invoke(t);
if (invoke != null) {
inerlist.add(invoke.toString());
}}}
outerlist.add(inerlist);
}
return outerlist;
}
反射提取完了之后发现有个问题,即获取的参数的顺序跟原来的方法不一致,想了好久,也没找到更好的办法.
那就换个思路,不使用反射,通过重写toString方法来实现所需要的的格式.
public static <T> List<List<String>> iterator2(Map<String, T> map, Class<T> clazz) throws Exception {
List<List<String>> outerlist = new ArrayList<>();
Iterator<Entry<String, T>> it = map.entrySet().iterator();
while (it.hasNext()) {
List<String> inerlist = new ArrayList<>();
Entry<String, T> entry = it.next();
T t = entry.getValue();
inerlist.add(t.toString());
outerlist.add(inerlist);
}
return outerlist;
}
//User类的toString格式如下.
@Override
public String toString() {
return ID + "," + name + "," + number + "," + power;
}
运行后发现符合要求.交差收工.
#欢迎关注-- ☆帮助各位同学辅导java相关问题☆.