乐字节Java反射之四:反射相关操作

大家好,乐字节小乐继续为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.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知识技术分享,乐字节原创

点赞