properties、反射

System.getProperty("user.home" )  user.home是用户的主目录     user.dir就是你运行程序时的目录

********************************************** Java ****************************************

配置文件获取 /props/xxxx.properties

java.util.ResourceBundle
public static Map<String,String> map = new HashMap<String,String>();
    static{
        try{
            ResourceBundle resb1 = ResourceBundle.getBundle("props.channels-ystpay-scan-alipay");
            Enumeration<String> e = resb1.getKeys();
            while (e.hasMoreElements()) {
                String key = e.nextElement();
                map.put(key, resb1.getString(key).trim());
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public static String getValue(String key){
        return map.get(key);
    }

 

****************************************** Java反射 ********************************************  当一个类被加载以后,Java虚拟机就会自动产生一个Class对象

Class c = Class.forName(strg);
这样获得Class类对象的方法,其实是利用反射API把指定字符串的类加载到内存中,所以也叫类加载器加载方法。这样的话,它会把该类的静态方法和静态属性,以及静态代码全部加载到内存中。但这时候,对象还没有产生。所以为什么静态方法不能访问非静态属性和方法。因为静态方法和属性产生的时机在非静态属性和方法之前

Class<?> clazz = Class.forName("net.xsoftlab.baike.TestReflect");
// 调用TestReflect类中的reflect1方法
Method method = clazz.getMethod("reflect1");
method.invoke(clazz.newInstance());
// Java 反射机制 - 调用某个类的方法1.
// 调用TestReflect的reflect2方法
method = clazz.getMethod("reflect2", int.class, String.class);
method.invoke(clazz.newInstance(), 20, "张三");

获取构造方法
clazz.getConstructors() 所有公有构造方法
clazz.getDeclaredConstructors() 所有的构造方法(包括:私有、受保护、默认、公有)
Constructor con = clazz.getConstructor(null);  获取公有、无参的构造方法
con = clazz.getDeclaredConstructor(char.class);   获取私有构造方法,并调用
        System.out.println(con);  
        //调用构造方法  
        con.setAccessible(true);//暴力访问(忽略掉访问修饰符)  
        obj = con.newInstance('男');  

获取字段
.getFields()  获取所有公有的字段
.getDeclaredFields() 获取所有的字段(包括私有、受保护、默认的)
.getDeclaredField("xxx") 获取私有字段****并调用

反射机制重设私有成员变量

public static void main(String[] args) {
            Reflactt re = new Reflactt("18");
            System.out.println(re.getAge());
            setFieldValue(re,"age","19");
            System.out.println(re.getAge());
            
        }
        public static void setFieldValue(Object obj, String fieldName,  
               String fieldValue) {  
            Field field = getField(obj, fieldName);  
            if (field != null) {  
               try {  
                   field.setAccessible(true);  
                   field.set(obj, fieldValue);  
               } catch (IllegalArgumentException e) {  
                   e.printStackTrace();  
               } catch (IllegalAccessException e) {  
                   e.printStackTrace();  
               }  
            }  
         }  
        private static Field getField(Object obj, String fieldName) {  
            Field field = null;  
           for (Class<?> clazz=obj.getClass(); clazz != Object.class; clazz=clazz.getSuperclass()) {  
               try {  
                   field = clazz.getDeclaredField(fieldName);  
                   break;  
               } catch (NoSuchFieldException e) {  
                   //这里不用做处理,子类没有该字段可能对应的父类有,都没有就返回null。  
               }  
            }  
            return field;  
        } 

 

posted @ 2017-12-03 12:04  苍天一穹  阅读(392)  评论(0编辑  收藏  举报