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