Java反射1

来源:互联网 发布:西方音乐史重点知乎 编辑:程序博客网 时间:2024/05/18 13:28

1.1. 概述

反射的概念是由Smith1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。

反射本身并不是一个新概念,尽管计算机科学赋予了反射概念新的含义。在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。通俗意思就是把Java类中的各种成分映射成相应的Java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个Java类来表示,就是汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示Java类的Class类显然要提供一个系列的方法来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,他们是FieldMethodContructorPackage等等。

1.2. Java类反射中的类

Java的类反射所需要的类并不多,主要是:ClassFieldConstructorMethodObject,下面我将对这些类做一个简单的说明。

1.2.1.Object类:

每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。

1.2.2.Class类:

Java类用于描述一类事物的共性,定义了该类事务有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。Java程序中的各个Java类,他们是否属于同一个类事务,是不是可以用一个类来描述这类事务呢?这个类就是Class

我们可以用Person类代表人,它的实例对象有张三、李四这样一个个具体的人,Class类代表Java类,它的各个实例对象又分别对象又分别对应什么呢?字节码。

对应各个类在内存中的字节码,例如:Person类的字节码,ArrayList类的字节码,等等。

如何得到字节码?

Ø         类名.class ,如:Date.class

Ø         对象.getClass(),如:new Date().getClass();

Ø         Class.forName(“类名”),如:Class.forName(“java.util.Date”)

注意:Java中有九中预定义字节码:8种基本数据类型和关键字void,用isPrimitive()方法可以判断是否是预定义字节码。int.class = Integer.TYPE

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

public Field[] getFields()

获取反射类中所有公有属性,包括父类的

public Field[] getDeclaredFields()

获取反射类中所有自定义的属性

public Field getField(String name)

用来过去反射类中指定的属性

public Field getDeclaredFields

(String name)

public Constructor[] getConstructors()

获取了反射类的所有公共构造方法的集合

public Constructor[]

getDeclaredConstructors()

获取了反射类的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法

public Method[] getDeclaredMethods()

反映此反射类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

public Method[] getMethods()

反映此Class对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共方法。

例子代码:

       String str1 = "abc";

       Class cls1 = str1.getClass();

       Class cls2 = String.class;

       Class cls3 = Class.forName("java.lang.String");

       System.out.println(cls1 == cls2);

       System.out.println(cls1 == cls3);

//两个打印都是true,因此三种得到字节码都是一样的

        //判断是否预定义字节码

System.out.println(cls1.isPrimitive());  //返回false

       System.out.println(int.class.isPrimitive());//返回true

       System.out.println(int.class == Integer.class); //返回false

       System.out.println(int.class == Integer.TYPE); //返回true

       System.out.println(int[].class.isPrimitive());////返回false

       System.out.println(int[].class.isArray());//返回true

      

原创粉丝点击