zoukankan      html  css  js  c++  java
  • Java 采用反射获取class的属性的值

    原理:Java的反射能够获取属性的名称,然后通过invoke调用类的某个方法。

    比如有个属性叫userName,这个类写了个方法叫getUserName,通过invoke调用getUserName这个方法。

    代码如下

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.Map;

    public class ParameterBase
    {
        
    /**
         * Get Class field and value Map
         * 
    @return
         
    */
        
    public Map<String, String> getClassInfo()
        {
            Map
    <String ,String>  fieldsAndValues = new HashMap<String, String>();
            Field [] fields 
    = this.getClass().getDeclaredFields();
            
    for(int i=0; i< fields.length; i++)
            {
                Field f 
    = fields[i];
                String value 
    = getFieldValue(this ,f.getName()).toString();
                fieldsAndValues.put(f.getName(),value);
            } 
          
    return fieldsAndValues;
        }  
        
        
        
        
    private  String getFieldValue(Object owner, String fieldName)
        {
            
    return invokeMethod(owner, fieldName,null).toString();
        }
        
        
        
    /**
         * 
         * 执行某个Field的getField方法
         * 
         * 
    @param owner 类
         * 
    @param fieldName 类的属性名称
         * 
    @param args 参数,默认为null
         * 
    @return 
         
    */
        
    private   Object invokeMethod(Object owner, String fieldName, Object[] args)
        {
            Class
    <? extends Object> ownerClass = owner.getClass();
            
            
    //fieldName -> FieldName  
            String methodName = fieldName.substring(01).toUpperCase()+ fieldName.substring(1);
            
            Method method 
    = null;
            
    try 
            {
                method 
    = ownerClass.getMethod("get" + methodName);
            } 
            
    catch (SecurityException e) 
            {

                
    //e.printStackTrace();
            } 
            
    catch (NoSuchMethodException e) 
            {
                
    // e.printStackTrace();
                return "";
            }
            
            
    //invoke getMethod
            try
            {
                
    return method.invoke(owner);
            } 
            
    catch (Exception e)
            {
                
    return "";
            }
        }
    }

     写一个类User继承于ParameterBase并写上一个测试代码

    public class User extends ParameterBase
    {
        String userName ;
        String passWorld;
        
    public String getUserName()
        {
            
    return userName;
        }
        
    public void setUserName(String userName)
        {
            
    this.userName = userName;
        }
        
    public String getPassWorld()
        {
            
    return passWorld;
        }
        
    public void setPassWorld(String passWorld)
        {
            
    this.passWorld = passWorld;
        }
        
        
    public static void main(String[] args)
        {
            User u 
    = new  User();
            u.passWorld 
    = "123";
            u.userName 
    = "aaaaa";
            System.out.println(u.getClassInfo().toString());
            
        }
    }

     程序输出

    {passWorld=123, userName=aaaaa}
  • 相关阅读:
    TCP和UDP的最完整的区别
    kafka重置到最新offset偏移量
    MYSQL中IN,INSTR,FIND_IN_SET函数效率比较
    本地不安装ORACLE,用PLSQL访问远程数据库
    MySQL中的DEFINER与SQL SECURITY
    Centos6.8 安装tomcat8.5.11
    动态代理模式
    linux下mysql允许远程连接
    全面理解Java中的String数据类型
    Spring中获取web项目的根目录
  • 原文地址:https://www.cnblogs.com/likwo/p/2010913.html
Copyright © 2011-2022 走看看