美文网首页
Ⅸ.反射

Ⅸ.反射

作者: 唐騦忆 | 来源:发表于2020-02-27 17:31 被阅读0次

    1. 类对象

    garen和teemo都是Hero对象,他们的区别在于,各自有不同的名称,血量,伤害值。
    Hero和Item都是类,他们的区别在于有不同的方法,不同的属性。
    类对象,就是用于描述这种类,都有什么属性,什么方法的

    2. 获取类对象的方法

    1. Class.forName
    2. Hero.class
    3. new Hero().getClass()
      在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的。更准确的讲是一个ClassLoader下,一种类,只会有一个类对象存在。通常一个JVM下,只会有一个ClassLoader。
      无论什么途径获取类对象,都会导致静态属性被初始化,而且只会执行一次。(除了直接使用 Class c = Hero.class 这种方式,这种方式不会导致静态属性被初始化)

    3. 通过反射创建对象

    import java.lang.reflect.Constructor;
    import charactor.Hero;
    public class TestReflection {
      
        public static void main(String[] args) {
            //传统的使用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();
            }
        }
    }
    

    4. 通过反射修改属性值

    import charactor.Hero;
      
    public class TestReflection {
      
        public static void main(String[] args) {
                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))

    相关文章

      网友评论

          本文标题:Ⅸ.反射

          本文链接:https://www.haomeiwen.com/subject/dtzfbctx.html