Java中的反射(1)

首先介绍反射机制的功能:

  • 在运行中分析代码
  • 在运行中查看对象
  • 实现通用的数组操作代码
  • 利用Method对象,这个对象很像C++中的函数指针

Class类:

学习反射即不得不接触一个新的类(Class类),在java运行时系统会为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行。

对于每个类而言,JRE都为其保留了一个不变的Class类对象 ,yige Class对象包含了特定的某个类的有关信息。

下面通过例子说明:

class Employee{
    private  int age;
    // private  String name;
    public int getage(){
       return this.age;
    }
   public void setage(int age){
      this.age=age;
   }
}

1。 第一种获取Class类实例的方法。对于Object类中的getClass()方发将会返回一个Class类型的实例

Employee e;
Class cl=e.getClass();

cl便是一个用来保存Employee类有关信息的Class类。一个Class对象表示一个特定类的属性(cl表示Employee类的特定属性)

如果存在一个类继承于Employee


class Manager extends{

}

Employee e1=new Employee();
Employee e2=new Manager();
Class cl1=e1.getClass();
Class cl2=e2.getClass();

就上 面的代码来介绍一个新的方法 Class类的getName()方法:

System.out.println(e1.getClass.getName());//Employee
System.out.println(e2.getClass.getName());// Manager

Data data=new Data();
Class cl=data.getClass();
String classname=cl.getName();"java.uitl.Data"

说明getName()的作用是输出一个对象所属的类的真实类名

2。 接着介绍另两种获取Class类实例的方法:

  • 一:
String classname="java.uitl.Data";
Clsaa cl=Class,forName(classname)

上面代码便是通过真实存在类名或者接口名获取一个Class实例,前提是这个classname必须真实存在,否则会抛出一个checkedexception异常

  • 二:如果T是任意的Java类型。T.class将代表匹配的类对象。例如:
Class cl1=Data.class;
Class cl2=int.class;

方法newInstance(),作用:根据一个类对象快速创建一个与这个对象具有相同类类型的实例。需要注意的是:通过newInstance()实例化一个对象时,调用的是这个类的无参构造函数。如果没有无参构造函数就会抛出异常

扫描二维码关注公众号,回复: 2404693 查看本文章
 Employee e1=new Employee();
 Employee e2= e.getClass().newInstance();
 e1.getClass()==e2.getClass();//true


 结合forName()和newInstance()使用
 String s="java.uitl.Data";
 Object m=Class.forName(s).newInstance();
 Data data=(Data)m;

猜你喜欢

转载自blog.csdn.net/xikai18827083487/article/details/52473247