• 乐字节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知识技术分享,乐字节原创

  • 相关阅读:
    AFHTTPRequestOperationManager网络请求的时候添加一个菊花,requestmapping
    媒体层图形技术之Core Animation 学习笔记
    PHP自动判断字符集并转码
    用PHP实现游戏中的一些常见功能
    从几个简单的程序看PHP的垃圾回收机制
    递归遍历PHP多维数组
    CodeIgniter的缓存机制与使用方法
    PHP的内存泄露问题与垃圾回收
    记录一下PHP数组数据分页的方法
    PHP正则表达式移除超链接文本
  • 原文地址:https://www.cnblogs.com/lotbyte/p/11165061.html
Copyright © 2020-2023  润新知