美文网首页
反射(Reflection)

反射(Reflection)

作者: 我是猪队友Y | 来源:发表于2016-10-05 19:52 被阅读0次
反射的包
  • java.lang.reflect

  • java.lang.Class

通过反射来了解类
  • 类由属性,方法,构造函数等组成
  • 给定一个类或者对象,通过反射机制可以动态的
    • 了解类的属性,方法,构造函数
    • 创建对象
    • 调用方法
    • 改写属性
  • 应用场景
    • 运行时,动态的情况下应对外面传入的类名,对象实例等
    • 只知道类名字符串
    • 通常应用到框架中
常用的反射操作
  • 通过一个对象获得完整的包名和类名
System.out.println("1.获得包名和类名============");
        Class c=dog.getClass();
        System.out.println("Method 1:");
        System.out.println("类名:"+c.getName());
        System.out.println("包名:"+c.getPackage().getName());
  • 获得Class对象 -3种方法:
           System.out.println("Method 1:");  //通过一个实例来获得class
           Class dog=new Dog().getClass();
           System.out.println(dog.getName());
           
           System.out.println("Method 2:");  //通过forname来获取路径下的class
           Class c=Class.forName(cName);
           System.out.println(c.getName());
           
           System.out.println("Method 3:");  //通过已知的类获取class
           Class b=Dog.class;
           System.out.println(b.getName());
  • 了解类的各种信息
    • 获得本类声明的方法
      getDeclaredMethods()
    • 获得所有public的方法
      getMethods()
    • 获得父类信息
      getSuperclass()
    • 获得接口信息
      getInterfaces()
  • 根据Class对象创建instance
    //方法一
            Object o=dogClazz.newInstance();  //调用类的空构造方法
            System.out.println("创建的对象是:");
            System.out.println(o);
            //方法二
            Constructor c=dogClazz.getConstructor(new Class[]{String.class,int.class});
            Object o2=c.newInstance(new Object[]{"大黄",5});
  • 操作成员变量

Field中的getGenericType()方法获得属性的类型

Class dogClazz=Dog.class;  //获得Calss
            Object o=dogClazz.newInstance();   //获得Clss的实例
            Field a=dogClazz.getField("age"); //获得公共属性
            a.set(o, 20);                    //设置属性(对象,值)
            System.out.println(a.get(o));    //得到对象所对应属性的值
            
            Field own=dogClazz.getDeclaredField("own"); //获得自定义属性
            own.setAccessible(true);           //设置该属性可访问修改
            own.set(o, "我的");
            System.out.println(own.get(o));
  • 调用成员方法
Object o=dogClazz.newInstance();   
            System.out.println("创建的对象:"+o);
            Method m=dogClazz.getMethod("bark", new Class[]{});   //和构造方法类似
            m.invoke(o, new Object[]{});

相关文章

网友评论

      本文标题:反射(Reflection)

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