JAVA反射技术的使用
前言
在开发html使用jquery提交post的时候,可以使用jquery遍历from元素里面的input元素实现参数组合,这样就不用手动打参数了,特别是在参数很多的时候,费神费时。
我开发Android提交Http的请求时,经常也会提交一大堆参数,而其中的参数是从相关POJO类的实例获取的,之前一直用手打参数,很麻烦,后面想到以前写c#的时候用到过反射,JAVA应该也会有吧,用反射,遍历实例类的属性,返回参数列表,方便多了。
原理
简单记录一下
User.class.getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
User.class.getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
field.getName()获取字段的名称
field.getType()获取字段的声明类型
getClass().getName() 获得完整的包名和类名
Class.forName("Reflect.Demo");实例化Class类对象
Class.forName("Reflect.Person").newInstance();通过Class实例化其他类的对象
Class.forName("Reflect.Person").getConstructors();取得全部的构造函数
Class.forName("Reflect.Person").getInterfaces();返回一个类实现的接口
Class.forName("Reflect.Person").getSuperclass();取得其他类中的父类
getModifiers()获取修饰符
getParameterTypes()获取参数类型
Method method=Class.forName("Reflect.Person").getMethod("sayChina");//调用Person类中的sayChina方法
method.invoke(Class.forName("Reflect.Person").newInstance());
调用get,set方法
/**
* @param obj
* 操作的对象
* @param att
* 操作的属性
* */
public static void getter(Object obj, String att) {
try {
Method method = obj.getClass().getMethod("get" + att);
System.out.println(method.invoke(obj));
} catch (Exception e) {
e.printStackTrace();
}
} /**
* @param obj
* 操作的对象
* @param att
* 操作的属性
* @param value
* 设置的值
* @param type
* 参数的属性
* */
public static void setter(Object obj, String att, Object value,
Class<?> type) {
try {
Method method = obj.getClass().getMethod("set" + att, type);
method.invoke(obj, value);
} catch (Exception e) {
e.printStackTrace();
}
}
通过反射操作属性
Class<?> demo = null;
Object obj = null; demo = Class.forName("Reflect.Person");
obj = demo.newInstance(); Field field = demo.getDeclaredField("sex");
field.setAccessible(true);
field.set(obj, "男");
通过反射取得并修改数组的信息
int[] temp={1,2,3,4,5};
Class<?>demo=temp.getClass().getComponentType();
System.out.println("数组类型: "+demo.getName());
System.out.println("数组长度 "+Array.getLength(temp));
System.out.println("数组的第一个元素: "+Array.get(temp, 0));
Array.set(temp, 0, 100);
System.out.println("修改之后数组第一个元素为: "+Array.get(temp, 0));
实现
了解了原理,实现起来就简单了
/**
* 通过反射获取上传参数
*
* @return
*/
public static RequestParams getParams(Object obj) {
if (obj == null)
return null;
Field[] fields = obj.getClass().getDeclaredFields();
RequestParams rp = new RequestParams();
for (int j = 0; j < fields.length; j++) {
fields[j].setAccessible(true);
try {
if (fields[j].get(obj) == null)
continue;
else
rp.add(fields[j].getName(), String.valueOf(fields[j].get(obj)));
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} return rp;
}
关于field还有一种情况我们需要注意,就是当字段修饰符为private时,我们需要加上:
field.setAccessible(true);
参考:
http://blog.csdn.net/z_l_l_m/article/details/8217007
http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
JAVA反射技术的使用的更多相关文章
- java 反射技术
什么是反射?反射就是将字节码中的各种成分映射到相应的java类中来,java反射技术自JDK1.1以来就出现了,目前大多数流行的框架都采用了这种技术,可见其重要性,这篇文章将详细介绍我对java反射技 ...
- Android中Java反射技术的使用示例
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Metho ...
- java反射技术实例
java反射技术实例1. [代码][Java]代码 package com.gufengxiachen.java.reflectiontest; public class Person {p ...
- Android 插件化开发(一):Java 反射技术介绍
写在前面:学习插件化开发推荐书籍<Android 插件化开发指南>,本系列博客所整理知识部分内容出自此书. 在之前的项目架构的博文中,我们提到了项目插件化架构,提到插件化架构不得不提的到J ...
- java反射技术主要实现类有哪些,作用分别是什么
Java反射技术主要实现类有哪些,作用分别是什么? 在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中 1)Class类:代表一个类 2)Field 类 ...
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
原文出处:博主宇宙的极客http://www.cnblogs.com/nokiaguy/archive/2010/07/27/1786482.html 众所周知,AlertDialog类用于显示对话框 ...
- 由浅入深理解----java反射技术
java反射机制详解 java反射机制是在运行状态下,对任意一个类可以获取该类的属性和方法,对任意一个对象可以调用其属性和方法.这种动态的获取信息和调用对象的方法的功能称为java的反射机制 clas ...
- 使用JAVA反射技术实现代码零耦合与功能无限扩展!
1.反射使用的背景 最近在做一个功能,就是实现邮件发送功能,但是邮件发送有不同的内容和数据格式,在开始设计的时候直接将发送的内容写在了发送模块中,后来发现功能增加后,无法继续在里边写了,因为里边的功能 ...
- java反射技术详解
反射: 其实就是动态的从内存加载一个指定的类,并获取该类中的所有的内容. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1. 获得Class对象,就是获取到指定的名称的字节码文件对象. 2 ...
随机推荐
- Win32 Plus Extra Height of Caption Bar
you set the size of the non-client area by handling the WM_NCCALCSIZE message. But don't do this unl ...
- ACM入门记
[2015.12]零基础进队 [2016.4.10]浙大第十六届程序设计大赛 [2016.6.4]团体程序设计天梯赛初赛 [2016.7.16]团体程序设计天梯赛决赛 赛后总结:比赛的时候好慌,一道题 ...
- [geeksforgeeks] Convert a given Binary Tree to Doubly Linked List
http://www.geeksforgeeks.org/in-place-convert-a-given-binary-tree-to-doubly-linked-list/ Given a Bin ...
- 通过HTTP头控制浏览器的缓存
通过HTTP头控制浏览器的缓存 浏览器缓存是提高用户体验和提升程序性能的一个很重要的途径,通过浏览器的缓存控制,可以对实时性要求不高的数据进行缓存,可以减少甚至不需要再次对服务器的请求就可以显示数据. ...
- 初学Ajax(二)
$.get()和$.post() .load()方法是局部方法,因为它需要一个包含元素的jQuery对象作为前缀.而$.get()和$.post()是全局方法,无须指定某个元素.对于用途而言,.loa ...
- 华为OJ:素数对个数
素数对个数 题目描述若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5.6和13,它们能应用于通信加密.现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“ ...
- WPA/WAP2wifi 密码破解笔记
前言: 相对于前一段时间脆弱的WEP路由器而言,当今的路由器加密方式也大都改变为WPA/WPA2,使得无线路由器的破解难度增加.虽然如此,但还是有很多漏洞层出不穷,如WPS.退一步来说,即使加密算法无 ...
- gcc: error trying to exec 'cc1plus': execvp: 没有那个文件或目录
问题: 解决办法: 1.没安装G++ 可使用 sudo apt-get install g++ 进行安装 2.gcc版本和g++版本不相符 可利用gcc -v和g++ -v 查看版本
- 图解TCP/IP读书笔记(一)
图解TCP/IP读书笔记(一) 第一章 网络基础知识 本学期的信安概论课程中有大量的网络知识,其中TCP/IP占了相当大的比重,让我对上学期没有好好学习计算机网络这门课程深感后悔.在老师的推荐下开始阅 ...
- css:map热点的应用
映射图像(Image Map)可以实现的效果是:一张图片上点不同位置可以跳转到不同的地方, 实例: 1.插入一张图片 2.在底部“属性”栏中选择合适的热点工具,在图片上绘制热点区域,如 3.然后返回代 ...