集合和反编译间的深入理解和认识

来源:互联网 发布:扫一扫软件免费下载 编辑:程序博客网 时间:2024/05/18 05:20

//解决通过输入对象的属性值来反编译输出属性的名字和方法对应的值的思维

/*

充分利用好f增强型的for循环和集合类以及反编译的只是,并且对集合以及反编译有较深的理解(重要)

1:设置方法取得属性名并存在一个集合中

2:利用增强for循环来实现对方法的获取

3:设置方法来取得方法的名字以便下面的反向激活

4:反向激活方法,获得其所需的值

5:把属性和值输出显示

*/

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;


public class Test8 {//测试类
public static void main(String[] args) throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
List<Student>class1=new ArrayList<Student>();
for(int i=1;i<=5;i++){
class1.add(new Student("张"+i,i,20));
}
List<Map<String,String>> list=ObjectConverterUtil.objectConverter(class1, Student.class);
int i=1;
for(Map<String,String>map:list){
System.out.println("第"+i+"个对象如下");
for(Entry<String,String>set:map.entrySet()){
System.out.println(set.getKey()+"\t"+set.getValue());

}
System.out.println();
i++;
}
}


}

public class ObjectConverterUtil {
public static <E>List<Map<String ,String>>objectConverter(List<E>list,Class c) throws SecurityException, NoSuchMethodException, IllegalArgumentException,IllegalAccessException, InvocationTargetException{   //抛出必备的异常
List<Map<String,String>> result=new ArrayList<Map<String,String>>();   //用list保存结果,父类引用指向子类的对象,体现了多态的特征
//1:取出e中的反射实例,=》取出所有的属性名
List<String> propertyNames=getPropertyName(c);  //  调用方法取得属性名字
for(E e:list){
Map<String,String>map=new HashMap<String,String>();//增强型的for循环

for(String propertyName:propertyNames){
String methodName=getMethodName(propertyName);  //通过属性名调用带有属性名字参数的方法以获得方法名字
Method m=e.getClass().getMethod(methodName, null);//获得方法的详细解析,名字和参数
Object obj=m.invoke(e,null);//激活获得的方法
map.put(propertyName, obj.toString());//吧属性和方法的结果放到map中
}
result.add(map);  //将map加到result中输出

}
return result;、、放回result作为最终结果
}

private static List<String>getPropertyName(Class c){
List<String>propertyNames=new ArrayList<String>();
Field []fs=c.getDeclaredFields();
if(fs!=null&&fs.length>0){
for(Field s:fs){
propertyNames.add(s.getName());//获取属性的名字
}
}
return propertyNames;
}

private static String getMethodName(String propertyName){
//String getMethodNames;
StringBuffer b=new StringBuffer();//对方法的拼接

String getMethodNames=b.append("get")+propertyName.substring(0, 1).toUpperCase()+propertyName.substring(1);

return getMethodNames;
}
}
0 0