zoukankan      html  css  js  c++  java
  • 3.3 反射机制和注解

    3.3 反射机制和注解

    借鉴链接:http://how2j.cn/k/reflection/reflection-class/108.html

    一、类对象:所有的类,都存在一个类对象,这个类对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法。

    类对象,就是用于描述这种类,都有什么属性,什么方法的。

    获取类对象有3种方式
    1. Class.forName
    2. Hero.class
    3. new Hero().getClass()
    在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的。

    无论什么途径获取类对象,都会导致静态属性被初始化,而且只会执行一次。

    二、反射机制获取对象于传统new比较

    与传统的通过new 来获取对象的方式不同,反射机制,会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象” 再通过构造器对象创建一个对象

      //传统的使用new的方式创建对象
            Hero h1 =new Hero();
            h1.name = "teemo";
            System.out.println(h1);
              
            try {
                //使用反射的方式创建对象
                String className = "charactor.Hero";
                //类对象
                Class pClass=Class.forName(className);
                //构造器
                Constructor c= pClass.getConstructor();
                //通过构造器实例化
                Hero h2= (Hero) c.newInstance();
                h2.name="gareen";
                System.out.println(h2);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    三、通过反射机制修改对象的属性

                Hero h =new Hero();
                //使用传统方式修改name的值为garen
                h.name = "garen";
                try {
                    //获取类Hero的名字叫做name的字段
                    Field f1= h.getClass().getDeclaredField("name");
                    //修改这个字段的值
                    f1.set(h, "teemo");
                    //打印被修改后的值
                    System.out.println(h.name);
                     
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

    getField和getDeclaredField的区别
    这两个方法都是用于获取字段
    getField 只能获取public的,包括从父类继承来的字段。
    getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 (注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))

    四、反射的作用

    当需要从第一个业务方法切换到第二个业务方法的时候,使用非反射方式,必须修改代码,并且重新编译运行,才可以达到效果。

    使用反射方式,首先准备一个配置文件,就叫做spring.txt吧, 放在src目录下。 里面存放的是类的名称,和要调用的方法名。
    在测试类Test中,首先取出类名称和方法名,然后通过反射去调用这个方法。
    当需要从调用第一个业务方法,切换到调用第二个业务方法的时候,不需要修改一行代码,也不需要重新编译,只需要修改配置文件spring.txt,再运行即可。
    这也是Spring框架的最基本的原理,只是它做的更丰富,安全,健壮。

    public class Test {
     
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public static void main(String[] args) throws Exception {
     
            //从spring.txt中获取类名称和方法名称
            File springConfigFile = new File("e:\project\j2se\src\spring.txt");
            Properties springConfig= new Properties();
            springConfig.load(new FileInputStream(springConfigFile));
            String className = (String) springConfig.get("class");
            String methodName = (String) springConfig.get("method");
             
            //根据类名称获取类对象
            Class clazz = Class.forName(className);
            //根据方法名称,获取方法对象
            Method m = clazz.getMethod(methodName);
            //获取构造器
            Constructor c = clazz.getConstructor();
            //根据构造器,实例化出对象
            Object service = c.newInstance();
            //调用对象的指定方法
            m.invoke(service);
             
        }
    }
    class=reflection.Service1
    method=doService1
  • 相关阅读:
    第三周学习笔记
    质量属性
    第四周学习
    逻辑回归
    架构的概念
    第二周总结
    线性回归
    十步走-阅读笔记六
    十步走-阅读笔记五
    P2633 Count on a tree
  • 原文地址:https://www.cnblogs.com/Smileing/p/11478390.html
Copyright © 2011-2022 走看看