# 静态编译&编码方式

静态编译&编码的方式是最常用的,也是我以前只知道的,特点就是A类必须要先存在。

class A {
	public void run() {
		System.out.println("A");
	}
}
public class test {
	public static void main(String[] args) {
		A a = new A();//创建之前A类必须要存在
		a.run();
	}
}

# 克隆方式

克隆一个对象实现的关键就是使用Cloneable接口。

class B implements Cloneable{
	public void run() {
		System.out.println("B");
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {//克隆必须要实现的接口
		// TODO Auto-generated method stub
		return super.clone();
	}
}
public class test {
	public static void main(String[] args) {
		B a = new B();
		try {
			B b = (B)a.clone();//这返回的是Object类型的对象,还要下转一下。
		    b.run();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

# 序列化和反序列化方式

借助于Serializable接口实现创建对象,这个更前一种克隆方式实现原理差不多,都是对已经创建好的对象进行复制,但是并不是同一个对象,即不是在同一个地址。这种创建的对象不安全,因为必须把已有的实例对象放到一个文件中,这就导致了信息有可能泄露。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class C implements Serializable{//序列化和反序列化要实现的接口
	public void run() {
		System.out.println("C");
	}
}
public class test {
	public static void main(String[] args) {
		C a = new C();
		try {
			ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.obj"));
		    out.writeObject(a);
		    out.close();
		    ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
		    C c = (C)in.readObject();//这返回的也是Object。
		    c.run();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
}

# 反射的方式

# 方式1

import java.lang.reflect.Method;
class D {
	public void run() {
		System.out.println("D");
	}
}
public class test {
	public static void main(String[] args) {
		try {
			Object obj = Class.forName("D").newInstance();//Class.forName返回的是一个类,newInstance实例化一个对象
		    Class clazz = obj.getClass();//获得类型类
			Method md = clazz.getMethod("run", null);//获取名为run的方法
			md.invoke(obj);//运行方法
			D d = (D)Class.forName("D").newInstance();//也可直接下转
			d.run();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
}

# 方式2

import java.lang.reflect.Constructor;
class E {
	public void run() {
		System.out.println("E");
	}
}
public class test {
	public static void main(String[] args) {
		try {
			Constructor<E> constructor = E.class.getConstructor();
			E e = constructor.newInstance();
			e.run();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
}