JAVA 创建对象的几种方式:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Obj {
public static void main(String[] args)
throws CloneNotSupportedException,
ClassNotFoundException,
IllegalAccessException,
InstantiationException,
NoSuchFieldException,
NoSuchMethodException,
InvocationTargetException,
IOException{
//1.使用new 创建一个对象
User u1=new User();
Addr a1=new Addr();
u1.setAddr(a1);
u1.setAge(1);
u1.setName("user1");
a1.setCod("a1");
a1.setAddress("海淀");
System.out.println("1.使用new创建一个对象 " + u1.toString());
System.out.println();
//2.使用clone创建一个对象(深度克隆)
User u2=(User)u1.clone();
Addr a2=u2.getAddr();
a2.setCod("a2");
u2.setName("user2");
System.out.println("2.2使用clone创建一个对象 " + u2.toString());
System.out.println("2.3使用clone创建一个对象 " + u1.toString()); //Addr 对象如果clone
//3.反射:利用java.lang.Class 或者 java.lang.reflect.Constructor.newInstance()
Class c3=Class.forName("jav.User");
printClass(c3);
User u3=(User)c3.newInstance();
Addr a3=u3.getAddr();
Field field= c3.getDeclaredField("addr");
String methodName = "set" + field.getName().substring(0,1).toUpperCase() + field.getName().substring(1);
System.out.println("methodName = "+ methodName);
Method m=c3.getMethod(methodName, Addr.class);
a3= new Addr();
a3.setCod("A33");
Object o=m.invoke(u3, a3); //o是返回值 , User实例通过依赖注入把一个新的对象注入addr属性中
System.out.println(u3.getAddr() + u3.getAddr().getCod());
//System.out.println("a3 = null: "+ (a3==null));//true
u3.setAddr(new Addr());
System.out.println("3.反射:利用java.lang.Class创建一个对象 " + u3.toString());
System.out.println("3.2反射:利用java.lang.Class 使用Method.invoke() 实现注入属性对象");
Constructor[] cons= User.class.getDeclaredConstructors();//获取默认构造函数
User u4=null;
for(int i=0;i<cons.length;i++){
Class[] paraC=cons[i].getParameterTypes();
//System.out.println(paraC.length); //默认构造函数 参数为0
if(paraC.length==0){//默认构造函数
//System.out.println(cons[i]);
u4=(User)cons[i].newInstance();
System.out.println("u4=" +u4.getName() + "addr ="+u4.getAddr());
//break;
}
else if(paraC.length==3){
Addr a4=new Addr();
a4.setCod("A44");
u4=(User)cons[i].newInstance("abc", 12, a4);
System.out.println("u4=" +u4.getName()+ " addr="+u4.getAddr());
}
}
System.out.println("3.3反射 使用java.lang.reflect.Constructor(构造函数)创建一个对象");
//4.反序列化,java.io.ObjectInputStream.readObject()
// ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream(new File("c:\\BAK\\test.txt")));
// os.writeObject(u1);//java.io.NotSerializableException
// os.close();
ObjectInputStream is=new ObjectInputStream(new FileInputStream(new File("c:\\BAK\\test.txt")));
User u5= (User)is.readObject();
is.close();
System.out.println("4.反序列化,java.io.ObjectInputStream.readObject 创建一个对象 "+u5);
}
static void printClass(Class c)
throws IllegalAccessException,
InstantiationException{
StringBuffer sb=new StringBuffer(256);
sb.append("name = ")
.append(c.getName())
.append("\n")
.append("simpleName = ")
.append(c.getSimpleName())
.append("\n")
.append("classLoader = ")
.append(c.getClassLoader())
.append("\n")
.append("fields = ");
Field[] fields=c.getDeclaredFields();
for(int i=0;i<fields.length;i++){
sb.append(fields[i].getName())
.append(" ")
.append(fields[i].getGenericType())
.append(" ");
//处理addr=null
// if("class jav.Addr".equals(fields[i].getGenericType())){
// System.out.println(1000);
// }
Class c6= fields[i].getType();
if("Addr".equals(c6.getSimpleName())){
Addr aa=(Addr)c6.newInstance();
}
}
sb.append("\n");
Method[] methods=c.getMethods();
sb.append("method = ");
for(int i=0;i<methods.length;i++){
sb.append(methods[i].getName());
sb.append(" ");
//method
//methods[i].invoke(obj, args)
}
sb.append("\n");
sb.append("Constructors = ");
Constructor[] cons=c.getDeclaredConstructors();
for(int i=0;i<cons.length;i++){
sb.append(cons[i].getName());
}
System.out.println(sb.toString());
}
}
class User implements Cloneable,Serializable{
private String name;
private int age;
private Addr addr; //Addr 实现Cloneable 深度克隆
public User(){
}
public User(String name,int age, Addr addr){
this.name=name;
this.age=age;
this.addr=addr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Addr getAddr() {
return addr;
}
public void setAddr(final Addr addr) {
//addr=new Addr();
this.addr = addr;
}
public String toString() {
StringBuilder sb=new StringBuilder();
sb.ensureCapacity(256);
sb.append("name: ")
.append(this.getName())
.append(" ")
.append("age: ")
.append(this.getAge())
.append(" ")
.append("addr: ")
.append(this.getAddr().getCod())
.append(" ")
.append(this.getAddr().getAddress());
return sb.toString();
}
protected Object clone() throws CloneNotSupportedException {
User u=(User)super.clone();
//克隆Addr
u.addr=(Addr)addr.clone();
return u;
}
}
class Addr implements Cloneable,Serializable{
private String cod;
private String address;
public String getCod() {
return cod;
}
public void setCod(String cod) {
this.cod = cod;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
protected Object clone() throws CloneNotSupportedException {
Addr a=(Addr)super.clone();
return a;
}
}
相关推荐
- clone() 方法是 Java 中的一个方法,它可以创建对象的拷贝,但是需要实现 Cloneable 接口,clone() 方法可以创建浅拷贝或深拷贝,浅拷贝只拷贝对象的引用,而深拷贝则拷贝对象的所有成员变量。 - 序列化机制是 ...
克隆方法创建对象是指利用对象自身的clone方法创建一个与原来对象内容相同的对象。这种方式不会调用原对象的构造方法。为了让一个类支持克隆操作,该类需要实现Cloneable接口。实现Cloneable接口的clone方法需要抛出...
这篇博文“MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象”探讨的是如何在Java编程中实现对象属性的深度复制。MyBatis是一个流行的Java持久层框架,它简化了数据库操作,而对象复制则是处理业务...
在Java编程语言中,对象克隆是一种创建一个与原对象具有相同数据的新对象的过程。对象克隆主要用于复制或备份对象,以便在不干扰原始对象的情况下对其进行修改或操作。本篇文章将详细探讨Java中的对象克隆及其实现...
如果一个类实现了`Cloneable`接口并重写了`clone()`方法,那么可以通过`clone()`创建对象的副本。例如: ```java class CloneExample implements Cloneable { // ... @Override protected Object clone() ...
- **浅拷贝**:创建一个新的对象,只复制对象的引用,不复制内部引用的对象。这意味着改变其中一个对象的内部引用对象,会影响另一个对象。 - **深拷贝**:创建一个全新的对象,不仅复制对象本身,还递归复制其...
如果一个类实现了`Cloneable`接口并覆盖了`Object`类中的`clone()`方法,我们就可以通过`clone()`方法创建对象的副本。请注意,正确实现`clone()`方法需要谨慎处理,以确保复制的数据也正确复制。例如: ```java ...
1. 浅克隆:默认的`clone()`方法执行的是浅克隆,它创建的新对象只复制原始对象的基本数据类型字段,对于引用类型的字段,新对象和原始对象共享同一个引用。这意味着对引用对象的修改会影响到原始对象。 2. 深克隆...
总之,Java中的对象复制与克隆是程序设计中重要的概念,它提供了创建对象副本的能力,而不会影响原始对象的状态。浅拷贝适用于简单的对象,而深拷贝则用于处理复杂的数据结构,确保对象之间的独立性。在实际应用中,...
1. 创建者类(Creator):这是核心类,它定义了创建对象的接口,但具体的创建过程由其实现类完成。 2. 具体创建者类(Concrete Creator):实现了创建者类的接口,负责实际的创建工作。 3. 原型接口(Prototype):...
标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到原始对象。 **浅拷贝**:在浅拷贝中...
如果一个类实现了`Cloneable`接口,那么可以通过调用`clone()`方法创建对象的副本。`clone()`方法创建的是浅复制,也就是说,如果对象的属性包含其他对象,那么这些对象不会被复制,而是共享同一引用。在深复制中,...
根据标题和描述,我们将详细探讨Java创建对象的五种主要方式。 1. **使用`new`关键字创建对象** 这是最常见的创建对象的方式,通过调用类的构造器来实例化对象。例如: ```java Object obj = new Object(); ```...
在Java编程语言中,面向对象特性是其核心概念之一,其中引用来传递对象是一个非常重要的知识点。本教程将深入探讨Java中的引用传递机制,并通过视频教程的形式帮助学习者更好地理解和应用这一概念。 首先,理解...
"Java 对象克隆详解" Java 对象克隆是 Java 编程中一个重要的概念。由于 Java 中的对象使用引用...Java 对象克隆是 Java 编程中一个重要的概念,它可以帮助我们创建对象的副本,并且可以帮助我们避免对象状态的修改。
- 如果一个类没有定义任何构造函数,则系统会自动提供一个无参的默认构造函数。 - 如果类中至少定义了一个构造函数,则不再提供默认构造函数。 4. **私有构造函数**: - 私有构造函数只能在当前类内部使用。 - ...
2. **反射机制**:通过`java.lang.Class`或`java.lang.reflect.Constructor`类的`newInstance()`方法创建对象,这允许在运行时动态创建对象。 3. **克隆对象**:利用`clone()`方法复制现有对象。需要注意的是,类...
在Java中,主要有以下几种创建对象的方式: - **new关键字**:这是最常见的创建对象的方式,通过new关键字和类的构造函数来创建。 - **反射**:利用java.lang.reflect包中的Class和Constructor类,动态地创建对象...
在Java中,当使用`new`关键字创建一个对象时,实际上创建的是一个指向该对象的引用。例如,以下代码创建了一个`PassObj`对象,并通过`objA`引用该对象: ```java PassObj objA = new PassObj(); ``` 这里的`objA`...
* 需要复制一个对象的所有属性时,可以使用原型模式创建对象的克隆。 * 需要在运行时动态创建对象时,可以使用原型模式创建对象的克隆。 然而,原型模式也存在一些限制,例如: * 原型模式不适合用于复制包含资源...