大家好,乐字节小乐继续为Java初学者讲述Java基础知识。上次说到乐字节Java反射之三:方法、数组、类加载器,这次是Java反射之四:反射相关操作
//1、获取Class对象 Class<?> clz=Class.forName("com.shsxt.ref.simple.User"); //2、获取对象 User u=(User)clz.newInstance(); //3、设置属性 Field field=clz.getDeclaredField("uname"); field.setAccessible(true);//打开权限 field.set(u, "0523"); //4、获取此属性 System.out.println(field.get(u));
调用方法,都是直接对象.方法([实参]);反射之后,动态调用方法需要使用 invoke即可。
1)、方法调用
//1、获取Class对象 Class<?> clz=Class.forName("com.shsxt.ref.simple.User"); //2、获取对象 User u=(User)clz.newInstance(); //3、获取方法 Method m =clz.getMethod("coding", String.class,String.class); //4、成员方法的调用 m.invoke(u, "反射","多个参数"); //若是静态方法,传递null即可 因为静态方法属性类,不属于对象 m=clz.getMethod("testStatic",int.class); m.invoke(null, 100);//与对象无关
2)、操作setter与getter访问器
/** * @param obj 操作的对象 * @param att 操作的属性 * @param value 设置的值 * */ public static void setter(Object obj, String att,Object value) { try { //setUname setUpwd -->第一个字母大写 att=att.substring(0,1).toUpperCase()+att.substring(1); Method method = obj.getClass().getMethod("set" + att, value.getClass()); method.invoke(obj, value); } catch (Exception e) { e.printStackTrace(); } } public static Object getter(Object obj, String att) { try { //getUname getUpwd -->第一个字母大写 att=att.substring(0,1).toUpperCase()+att.substring(1); Method method = obj.getClass().getMethod("get" + att); return method.invoke(obj); } catch (Exception e) { e.printStackTrace(); } return null; } main方法 //1、获取Class对象 Class<?> clz=Class.forName("com.shsxt.ref.simple.User"); //2、获取对象 User u=(User)clz.newInstance(); //3、设置值 setter(u,"uname","shsxt"); //获取值 String str=(String) getter(u,"uname"); System.out.println(str);
利用反射+配置文件可以实现简单工厂模式。
interface Car{ void run(); } class Bmw implements Car{ public void run(){ System.out.println("小样,学的怎么样"); } } class QQ implements Car{ public void run(){ System.out.println("大哥,救我"); } } class Benz implements Car{ public void run(){ System.out.println("哈哈"); } } //简单工厂 class CarFactory{ public static Car product2(String carStr){ if(carStr.equals("qq")){ return new QQ(); }else if(carStr.equals("benz")){ return new Benz(); } //如有其它车辆,需要添加代码 return null; } /** * 根据字符串 创建对象 * @param carStr * @return */ public static Car product(String carStr){ try { return (Car)Class.forName(carStr).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } } #car.properties qq=com.shsxt.ref.simplefactory.QQ benz=com.shsxt.ref. simplefactory.Benz bmw=com.shsxt.ref. simplefactory.Bmw public static void main(String[] args) throws Exception { //加载配置文件 Properties pro =new Properties(); pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("car.properties")); //获取对应的 完整路径(报名.类名) String clz =pro.getProperty("qq"); CarFactory.product(clz).run(); }
Java反射相关知识就讲到这里了,下次我们进入到JavaSE的课程:循环控制
请继续关注乐字节,Java知识技术分享,乐字节原创