大家好,乐字节小乐继续为Java初学者讲述Java基础知识。上次说到乐字节Java反射之三:方法、数组、类加载器,这次是Java反射之四:反射相关操作

1、操作属性

//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));

2、调用方法

调用方法,都是直接对象.方法([实参]);反射之后,动态调用方法需要使用 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);

3、利用反射编写简单工厂设计模式

利用反射+配置文件可以实现简单工厂模式。

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.propertiesqq=com.shsxt.ref.simplefactory.QQbenz=com.shsxt.ref. simplefactory.Benzbmw=com.shsxt.ref. simplefactory.Bmwpublic 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知识技术分享,乐字节原创