package com.demo.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* java反射机制:java在运行状态中,能够动态获取任意一个类的所有属性、方法、构造方法,并能够对该类的属性值进行操作
* 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
* @author quny
* @date 2015-3-29
* @Version V 1.0
*/
public class Test {
@SuppressWarnings("rawtypes")
public static void main(String[] args) throws Exception {
A a = new A();
a.setName("张三");
Class temp = a.getClass();
//获取类的所有公有属性
Field[] fields = temp.getFields();
System.out.println("----------------------获取类的所有公有属性-----------------------------");
for(int i = 0; i < fields.length; i ++){
//获取公有属性的属性名、属性类型、属性值
System.out.println("propertyName:"+fields[i].getName()+
" -> type:"+fields[i].getType()+
" -> vlaue:"+fields[i].get(a));
}
//获取类的所有属性
Field[] fd = temp.getDeclaredFields();
System.out.println("----------------------获取类的所有属性-------------------------------");
for(int i = 0; i < fd.length; i ++){
//获取公有属性属性类型
System.out.println(" -> type:"+fd[i].getType());
}
//获取公有属性中指定的属性
System.out.println("----------------------获取公有属性中指定的属性-------------------------------");
Field property1 = temp.getField("password");
//Field类的set方法用来设置反射类的指定属性的值
property1.set("name", "李四");
System.out.println("propertyName:"+property1.getName()+" -> type:"+property1.getType()+" -> value:"+property1.get(a));
//获取所有属性中指定的属性
System.out.println("----------------------获取所有属性中指定的属性-------------------------------");
Field property2 = temp.getDeclaredField("age");
//Field类的setAccessible方法是用来设置访问反射类的私有属性的权限,默认是false不能访问,设置诚true才能访问
property2.setAccessible(true);
//Field类的set方法用来设置反射类的指定属性的值,该方法只能设置String类型的属性的值
// property2.set("age", 20l);
System.out.println("propertyName:"+property2.getName()+" -> type:"+property2.getType()+" -> value:"+property2.get(a));
Constructor[] cons = temp.getConstructors();
System.out.println("----------------------获取反射类的构造方法集合-------------------------------");
for(int i = 0; i < cons.length; i ++){
System.out.println("methodName:"+cons[i].getName());
System.out.println("----------------------获取反射类的构造方法的参数集合-------------------------------");
Class[] params = cons[i].getParameterTypes();
for(int j = 0; j < params.length; j ++){
System.out.println("paramName:"+params[j].getName());
}
}
//获取反射类的父类
System.out.println("----------------------获取反射类的父类-------------------------------");
System.out.println("parentName:"+temp.getSuperclass().getName());
//获取反射类的所有接口
Class[] inters = temp.getInterfaces();
for(int b = 0; b < inters.length; b ++){
System.out.println("interfaceName:"+inters[b].getName());
}
System.out.println("----------------------获取反射类的方法集合-------------------------------");
Method[] methods = temp.getMethods();
for(int c = 0; c < methods.length; c ++){
System.out.println("methodName:"+methods[c].getName());
}
//在运行时构造任意一个类的对象
A newA = (A) temp.newInstance();
System.out.println(newA.getName());
}
}
//反射机制应用
首先 我们建立一个用户输入的页面,有两个字段:UserName和PassWord
<form action="./UserServlet">
userName:<input type="text" name="userName"/><br>
passWord:<input type="text" name="passWord"/><br>
<input type="submit" value="login">
</form>
然后,我们建立字段的Bean类 进行封装 UserBean:
public class UserBean {
private String userName;
private String passWord;
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
再次建立一个工具类 就是应用到的反射的核心代码 Tools.java
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
public class Tools {
public static Object initBean(HttpServletRequest request,Class cls)
{
Object obj = null;
try {
obj = cls.newInstance();
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
String fieldName = field.getName();
Method method = cls.getDeclaredMethod("set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1), new Class[]{String.class});
String value = request.getParameter(fieldName);
method.invoke(obj, new Object[]{value});
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
public static void main(String[] args) throws Exception {
Class cls = Class.forName("com.accp.UserBean");//根据类名来得到一个Class对象
Class c = UserBean.class;//根据类来得到一个Class对象
Object o = cls.newInstance();//通过类得到一个实例对象 UserBean bean = new UserBean();
}
}
最后 建立页面提交到的Servlet UserServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
UserBean bean = (UserBean)Tools.initBean(request, UserBean.class);
System.out.println(bean.getUserName()+" "+bean.getPassWord());
}
这样就实现了 运用反射 动态获取数据的效果