Java中,类的实例化方法一共有四种途径:
1.使用new
操作符
2.调用Class对象的newInstance()
方法
我们在自定义图书类这个例子中,编写了有参数的构造方法public Book(String name, String author, String ISBN)
。但如果类中没有定义构造方法,编译器便会自动添加一个无参数的构造方法。使用构造方法创建对象虽然常用,但并不灵活。因此,我们再来了解一下动态化实例类,也就是调用Class对象的newInstance()
方法,通过反射创建对象。了解一下反射的概念:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
package com.shiyanlou.course;
import java.io.File;
import java.lang.reflect.Constructor;
//需要引用上述两个包
public class Test {
public static void main(String[] args) {
try {
Constructor<File> constructor = File.class.getDeclaredConstructor(String.class);
//获得File类的Constructor对象
System.out.println("Create File Object with reflection.");
//使用反射创建File对象
File file = constructor.newInstance("/home/shiyanlou/Desktop/MyFile.txt");
System.out.println("Use File Object to create MyFile.txt on desktop.");
//指定了创建的路径为桌面,名称为“MyFile.txt”
file.createNewFile(); //创建新的文件
System.out.println("File is created ?" + file.exists());
//验证文件是否创建成功
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.调用clone()
方法,对现有实例的拷贝。虽然Clone方法在Object中存在的,但是如果想要调用clone必须实现Cloneable接口。要实现深拷贝必须在clone方法中调用相应对象的clone函数。
public class Glasses implements Cloneable {
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
//在Student类中包含Glasses,代码如下:
public class Student implements Cloneable{
private String studentName;
private Glasses glasses;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public Glasses getGlasses() {
return glasses;
}
public void setGlasses(Glasses glasses) {
this.glasses = glasses;
}
protected Object clone() throws CloneNotSupportedException {
Student student = (Student) super.clone();
student.glasses= (Glasses) glasses.clone();
return student;
}
}
//如果想对Glasses进行拷贝,而不是仅仅克隆Glasses的引用,在clone方法中增加了student.glasses= (Glasses) glasses.clone();
public static void main(String args[]){
Student student = new Student();
student.setAge(10);
student.setStudentName("xiaobai");
Glasses glasses = new Glasses();
glasses.setColor("red");
student.setGlasses(glasses);
try {
Student s1 = (Student) student.clone();
s1.setStudentName("xiaohei");
System.out.println("s1.color:"+s1.getGlasses().getColor());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
4.通过ObjectInputStream
的readObject()
方法反序列化类