简单的案例解析Java反射机制

来源:互联网 发布:湘潭大学网络教育 编辑:程序博客网 时间:2024/05/21 04:20

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());
    }
 

 

这样就实现了 运用反射 动态获取数据的效果

 


 

0 0
原创粉丝点击