11.反射机制

一.定义

  反射机制:程序可以访问,修改它本身状态或行为的能力,并根据自身行为状态,进行调整或修改。

  分类:传统RTTI:编译期

     反射机制:运行期

  反射的功能:判断类,属性方法,创建对象,调用

  对反射的理解:底层防止占内存的一种机制

         

二.Class类

  每个类都有一个对应的Class类,封装了当前类的信息。

  平时创建对象是利用类的构造器。Class类里面封装了类的信息,包括构造器,所以也可以用来创建对象,但也因此多了一个获取构造器的过程。

  Class类在类加载时自动生成。

  与*.class字节流文件不同,Class类不仅封装了类的信息,还包括一些物理信息。更偏重底层。

  Class创建对象返回的是obj类型需要强转。

 

三.生成Class对象的三种方式

  • Class.forName("类的完整名:包名+类名");
  • Class c=Student.class----------类名.class的方式创建对象
  • 对象.getClass();---------------getClass()方法时obj的方法
  • 由JDBC我们知道了他们的区别是:*.class的方式不加载类;而forName和getClass的方式加载了类。

四.创建对象的具体内容

  1.*.class方式创建对象:   

Class c=Student.class;
Student s=(Student)c.newInstance();
//c.newInstance()可以创建类对象,返回object方法,实际上调用的是无参构造器。没有无参构造器会报错。运行时报错

  2.获取构造器的方式创建对象

     分为四种情况,所有构造器,一个构造器,所有权限,公共权限 

c.getConstructors();            //获取所有public构造器
c.getConstructor(double.class); //获取一个public权限的构造器
c.getDeclaredConstructors();    //获取所有权限的所有构造器
c.getDeclaredConstructor();      //获取指定权限的一个构造器    
Class c=Student.class;
Student s=(Student)c.newInstance();
Constructor con=c.getConstructor();
con.setAccessible(true);//必要时,打开权限
con.newInstance(5,"sss");

五.获取对象的属性和方法

  • 普通方法
c.getMethods();//包括父类的方法
c.getMethod("func1",String.class);//包括父类
c.getDeclaredMethods();//没有父类的
c.getDeclaredMethod();//没有父类的

m.setAccessbile(true);//必要时
m.invoke(obj);//参数为调用这个方法的对象。
//该方法的返回值为调用方法的返回值
  • 静态方法
Method m=c.getDeclaredMethod();
m.invoke(null);//静态方法传至传null就行,因为还没有对象
  • 属性
Student s=(Student)c.newInstance();
Field f=c.getField("name");
System.out.println(f.get(s));//打印某个学生的名字属性
//大致同方法
  • 补充:类型判定 xxx isInstance(xxx) 和 xxx instanceof xxx
Class c=Person.class;
c.isInstance(new Student());

student instanceof Person;
syso(c instanceof Person);//boolean类型
//如果类型不兼容,直接报错

 

上一篇:动态代理机制+反射


下一篇:Java反射技术概述