zoukankan      html  css  js  c++  java
  • 乐字节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知识技术分享,乐字节原创

  • 相关阅读:
    #18.2.27 codevs1098 均分纸牌
    18.2.26 codevs3143 二叉树的序遍历
    18.2.14 codevs1501 二叉树最大宽度和高度
    18.2.14 codevs1011 数的计算
    18.2.14 【水】codevs1475 m进制转十进制
    18.2.14 【水】codevs1474 十进制转m进制
    18.2.14 【水】codevs1430 素数判定
    18.2.13 codevs1212 最大公约数
    18.2.13 codevs1012 最大公约数和最小公倍数问题
    17.12.31 链表合并
  • 原文地址:https://www.cnblogs.com/lotbyte/p/11165061.html
Copyright © 2011-2022 走看看