反射-初识

来源:互联网 发布:国外人工智能网站 编辑:程序博客网 时间:2024/06/06 00:46

一、反射的概述

在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性与方法,任意一个对象都可以调用他的属性与方法

反射机制:动态获取java类中信息(属性、方法)的机制

可以理解为类的解剖

 

反射有什么用呢?

如果想要对制定名称的字节码文件进行加载并获取其中的内容并调用,这时就使用到了反射技术

以tomcat为例,他提供了处理请求和应答的方式,因为具体的处理动作不同,所以对外提供的接口由开发者来实现具体的请求和应答处理

比如:自定义一个类,并实现Servlet(这个是tomcat提供的),那么我们就必须实现其中已经定义好的请求、应到的处理方式

Class myClassimplements Servlet

{

         //实现方法

}

类与用户之间的桥梁:配置文件,配置文件中已经定义好了类的一些元素

JAVA会对类文件(字节码文件)向上抽取一些共性:名称、字段、构造函数、一般函数

 

二、获取class对象的三种方式

1、Object类中的getClass()方法

Personp=newPerson(12,"zhangsan");

       Class clazz=p.getClass();

这种方式的使用前提是:必须要明确具体的类,并创建对象,使用上比较麻烦,不常用

2、任何数据类型都具备一个静态的属性,class来获取其对应的class静态成员属性

         Classclazz=Person.class;

         使用时比较简单,但是还是需要明确所使用的类的名称,这种扩展性较差,不常用

3、只要通过给定的类的字符串名称即可实现

         Classclazz=Class.forName(“cn.itheima.bean”),在调用forName方法时有可能出现ClassNotFoundException异常,需要抛出或者捕获异常

里面的字符串的必须是类的完整路径:cn.itheima.bean

第三种方式很常用,而且扩展性较强,反射的时候经常使用此方法

三、反射的使用

String name=”cn.itheima.bena.Person”

//寻找改名称的类文件,并加载到内存,并产生class对象

Class clazz=Class.forName(name);

         //产生类对象,他会返回一个object对象

         Objectobj=clazz.newInstance();

newInstance:相当于对象的new方法,会调用class里面的空参构造函数

注意:一般被反射的类都有一个空参,但如果获取指定的名称对应的类中没有空参构造函数时,一般先获取到这个类中的构造函数,通过字节码文件对象可以完成:getConstructors();他会获取这个类所有的构造函数

但这个方法只能获取公有的构造函数

获取构造方法:

    String name=”cn.itheima.bena.Person”

    Classclazz=Class.forName(name);

       Constructorconstructor=clazz.getConstructor(String.class,int.class)

       Objectobj=constructor.newInstance(“xiaomin”,39);

获取字段:

         Fieldf=clazz.getField(“age”)//只能获取公共的

         Fieldf=class.getDeclaredField(“age”)//获取所有的

 

  获取字段的值:

         对私有字段的访问权限取消,暴力访问

         Field.setAccessible(true)

         Objectobj=clazz.newInstance();

         Objecto=f.get(obj);

         System.out.println(o)//这里打印age默认的值

 获取公共函数:获取公有的方法

          Class clazz=Class.forName(“cn.itheima.bean.Person”);

Method[] methods=clazz.getMethods();

For(Methodm:methods)

         {

                   //打印所有的方法

                   System.out.println(m);

}

如果要获取所有的方法,包括私有的
         Method[]methods=clazz.getDeclareMethods();

获取空参数的一般方法

         Methodmethod=clazz.getMethod(“show”,null);//他会获取到show方法

运行某个方法:

         Objectobj=clazz.newInstance();

         Method.invoke(obj,null);

 

0 0