Object类与reflect包

来源:互联网 发布:iphone8必备软件推荐 编辑:程序博客网 时间:2024/06/08 10:32

一、类Object是类层次结构的根类。主要包括如下方法:

1、clone():创建并返回该对象的副本。

2、equals(Object obj):两个引用变量指向的是同一个对象,一般要重写。

3、getClass():返回该对象的运行时类。

4、hashCode():返回哈什值。

5、toString():返回该对象的字符串表示。


Java反射机制可以提供如下功能:

1、在运行时判断任意一个对象所属的类;
2、在运行时构造任意一个类的对象;
3、在运行时判断任意一个类所具有的成员变量和方法;
4、在运行时调用任意一个对象的方法。

二、在JDK中,主要由以下几个类实现反射机制:

1、Class类:类,提供了如下方法:

getName():获得类的完整名字;
getFields():获得类的public类型的属性;
getDeclaredFields():获得类的所有属性;
getMethods():获得类的public类型的方法;
getDeclaredMethods():获得类的所有方法;

getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型;

getConstructors():获得类的public类型的构造方法;
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型;
newInstance():通过类的不带参数的构造方法创建这个类的一个对象;


2、Field类:成员变量,提供了如下方法:

getXxx(Object o):获取object对象的该成员变量的值

setXxx(Object o,Xxx val):设置object对象的该成员变量的值

3、Method类:成员方法,提供了如下方法:

Object invoke(Object obj,Object ...args):obj是主调,后面的args是执行该方法时传入的参数

4、Constructor类:构造方法,提供了如下方法:

newInstance(Object...args):创建实例

5、Array类:可以动态创建数组以及访问数组的功能


三、Class获取途径:

1、运用getClass()方法:
String str = "abc";
Class class = str.getClass();


2、运用Class.getSuperclass()方法:
Button b = new Button();
Class c1 = b.getSuperclass();

3、运用静态方法Class.forName(),这个最常用:
Class c2 = Class.forName("java.util.Date");

4、运用.class语法:
Class c1 = String.class;

5、运用原始包装类的TYPE方法:
Class c1 = Character.TYPE; 


四、类初始化时机

1、使用new关键字实例化对象的时候、读取或者设置类的静态字段的时候、调用类的静态方法的时候;

2、使用反射机制对类进行反射调用的时候;

3、初始化一个类,如果其父类还没有初始化,需要先初始其父类;

4、虚拟机启动时,用户需要指定一个要执行的主类(包含main()),虚拟机会先初始化这个主类;

5、接口在初始化时,并不要求所有父类都完成初始化,只有真正使用到副接口时才会初始化。


五、创建对象的方式

1、通过new语句实例化一个对象

2、通过反射机制创建对象

     Class  c=Class.forName("类名");

     xx=c.newInstance();

3、通过clone()方式创建对象

     实现clonable接口,重写object的clone()方法

     深复制:复制后的对象副本的引用变量指向的是新对象

     浅复制:复制后的对象副本的引用变量与原来的对象的引用变量指向同一个对象

4、通过反序列化方式创建对象

     实现Serializable接口,创建ObjectOutputStream输出流,调用writeObject()方法;创建ObjectInputStream输出        流,调用readObject()方法

     Java序列化算法:经过序列化的对象都有一个序列化编号;序列化一个对象时,首先检查该对象有没有被序列化过,如果有被序列化过,就只输出一个序列化编号

原创粉丝点击