【Java技术-反射】Java反射机制

        包名: java.lang.reflect.*
        Java反射机制是在运行状态(Runtime)中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,获取它的成员变量;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

        Java反射机制是Java语言被视为"准动态"语言的关键性质。Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的内部信息(包括其modifiers(诸如public, static等等)、superclass(例如Object)、实现interfaces(例如Serializable),也包括fields和 methods的所有信息),动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法)。

        Java反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。


1. Object
     1.1 Class<?getClass()
    Returns the runtime class of this Object.
例: KeyBoard k = new KeyBoard();
     Class<?> clazz = k.getClass(); 或 Class clazz = k.getClass();

2. Class
         Class对象是Java反射的基础,它包含了与类相关的信息,事实上,Class对象就是用来创建类的所有对象的。Class对象是java.lang.Class<T>这个类生成的对象,其中类型参数T表示由此 Class 对象建模的类的类型。例如,String.class的类型是 Class<String>;如果将被建模的类未知,则使用Class<?>。以下是Java API的描述:

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

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

        每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生一个Class对象(更恰当的说,是被保存在一个同名的.class文件中)。如果我们想生成这个类的对象,运行这个程序的Java虚拟机(JVM)将使用类加载器子系统,类加载器首先检查这个类的Class对象是否已经加载。如果尚未加载,默认的类加载器就会根据类名查找.class文件,并将其载入,一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。

获取Class对象有三种方式:

       (1) Object类的getClass()方法,例:

            Class c1 = new String("").getClass();

       (2) Class类的静态方法forName(),例:
            Class c2 = Class.forName(className);

        当使用Class.forName()方法时,必须提供完全限定类名。即类名要包括所有包名。

       (3) 使用类字面常量或TYPE字段,例:
            Class c3 = Manager.class;

            Class c4 = int.class;

            Class c5 = Double[].class;

        这种方式不仅更简单,而且更安全,因为它在编译时就会受到检查,并且根除了对forName方法的调用,也更高效,建议使用“.class”的形式
        TYPE是基本数据类型的包装类型的一个标准字段,它是一个引用,指向对应的基本数据类型的Class对象,附表如下:     

boolean.class

Boolean.TYPE

char.class

Character.TYPE

byte.class

Byte.TYPE

short.class

Short.TYPE

int.class

Integer.TYPE

long.class

Long.TYPE

float.class

Float.TYPE

double.class

Double.TYPE

void.class

Void.TYPE

   

    使用Java反射,你可以在运行时检查Java类。检查类是使用反射时经常做的第一件事情。从类中可以获取以下信息:

(1) 类名

(2) 类修饰符 (public, private, synchronized)

(3) 包信息

(4) 父类

(5) 实现的接口

(6) 构造函数

(7) 方法

(8) 字段

(9) 注解

(10) 内部类


    2.1 类名(getName(), getSimpleName())

    从Class对象中可以获取两个不同的类名。完全限定类名(包括包名)可以使用getName()getCanonicalName()方法获取,例如:

        Class myClazz = MyObject.class;

        String className = 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值