前言:
泛型怎么学习?有什么好方法?我这里没有!我学泛型的方法就是用起来.看到自己代码里有重复的方法...,那就想办法提取.多写多尝试.
泛型的知识点这个博文https://blog.youkuaiyun.com/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格式如下.@Overridepublic String toString() {return ID + "," + name + "," + number + "," + power;}
运行后发现符合要求.交差收工.
#欢迎关注-- ☆帮助各位同学辅导java相关问题☆.

本文通过实例讲解了如何在Java中使用泛型和反射来简化代码,避免重复编写相似方法。介绍了通过泛型和反射遍历不同类型的Map集合,并通过重写toString方法优化输出格式。
147

被折叠的 条评论
为什么被折叠?



