Java反射机制初体验(1)

发表于:2013-3-08 09:11

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:AlanZhang    来源:51Testing软件测试网采编

  反射机制

  JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

  反射的基石:Class类

  Java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class。注意:与小写class的区别,它是定义类时使用的关键字。

  Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

  Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。、

  如何得到各个字节码对应的实例对象(Class类型)三种

  创建顺序:字节码在硬盘中——>加载到内存中——>创建对象。

  形式:Class class=字节码;

  1、Class class1=Date.class;     //固定写法

  2、Class class2=new Date().getClass();  //有了字节码创建的对象

  3、Class class3=Class.forName(“java.uti.Date”);   //静态方法。(这是主要方式:因为写源程序时还不知道类的名字,写源程序时可以用一个字符串变量,然后从配置文件按中读取)

  forName得到类的字节码有两种情况:

  1)字节码已加载到内存中,无需加载,找到字节码返回。

  2)虚拟机还没有字节码,用类加载器,将字节码缓存起来(以后无需再加载),使用forName方法获取。

  代码示例

 package reflect;
 
 public class ReflectTest {
 
     /**
      * @author alan
      * @param args
      * @throws Exception
      */
     public static void main(String[] args) throws Exception {
         /*
          * String的字节码在虚拟机是同一份。
          * class1、class2、class3是此字节码的三个事例,所以三者相等。
          */
         String string="string";
         Class class1=string.getClass();
         Class class2=String.class;
         Class class3=Class.forName("java.lang.String");
         System.out.println(class1==class2);
         System.out.println(class1==class3);
        
         /*
          * 有九种预定义的 Class 对象,表示八个基本类型和 void。
          * 这些类对象由 Java 虚拟机创建,与其表示的基本类型同名,
          * 即 boolean、byte、char、short、int、long、float 和 double。
          * 只要在源程序中出现的类型,都有各自的Class实例对象。如:int[]、void...
          */
         System.out.println(String.class.isPrimitive());        //String不是基本类型的字节码。
         System.out.println(int.class.isPrimitive());
         System.out.println(int.class==Integer.class);        //int与Integer有不同的字节码。
         System.out.println(int.class==Integer.TYPE);        //Integer.TYPE表示Integer所包装的基本类型的字节码。
         System.out.println(int[].class.isPrimitive());        ///数组类型不是原始类型。
         System.out.println(int[].class.isArray());                //判定此 Class 对象是否表示一个数组类。
     }
 
 }

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号