不用new新建对象的方式有哪些?
解决方案 »
- Robot mouseMove 在Win7下无效,为什么?
- java 源码问题 SinglePixelPackedSampleModel类
- JPanel下利用鼠标事件绘图时产生的问题
- 求CFS加密算法的java代码(附C的代码)
- 继续请教关于UDP返回字符处理的方法,请指点下 谢谢
- 请问中文乱码的解决方法
- 用什么技术实现联众,QQ游戏的风格界面?
- 请各位大虾多多帮忙!~ 急 (在线等)
- 如何判断一个process已经结束?
- 大哥们这是我最后30分了,全给了!是关于JTree的一个很简单的问题
- 这个代码哪里不对
- 跟applet相关 在applet中怎么把一个图像文件嵌入图像图标 然后把图像图标置于标签label中
我目前知道两种
再一个就是new了,或者就是到工厂里面取得了?(工厂模式)
public T newInstance()
throws InstantiationException,
IllegalAccessException创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化之。
注意,此方法传播 nullary 构造方法所抛出的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译时的异常检查,而在其他情况下编译器都会执行该检查。 Constructor.newInstance 方法将该构造方法所抛出的任何异常包装在一个(已检查的)InvocationTargetException 中,从而避免了这一问题。
返回:
此对象所表示的类的一个新分配的实例。
抛出:
IllegalAccessException - 如果此类或其 nullary 构造方法是不可访问的。
InstantiationException - 如果此 Class 表示一个抽象类、接口、数组类、基本类型或 void; 或者该类没有 nullary 构造方法; 或者由于某种其他原因导致实例化过程失败。
ExceptionInInitializerError - 如果该方法引发的初始化失败。
SecurityException - 如果存在安全管理器 s,并满足下列任一条件:
调用 s.checkMemberAccess(this, Member.PUBLIC) 拒绝创建该类的新实例
调用方的类加载器不同于也不是该类的类加载器的一个祖先,并且对 s.checkPackageAccess() 的调用拒绝访问该类的包
工厂方法之类的其本质还是new一个出来,
ObjectInputStream本质还是反射...
2.clone若程序写成如下,则可以根据当前对象(this)建立一个新实例对象(没有调用构造函数).
Java代码 1. public class Something implements Cloneable{
2. private Something obj;
3. public Something cloneSomething()
4. {
5. try {
6. obj = (Something)this.clone();
7. // obj = (Something)clone();
8. } catch (CloneNotSupportedException e) {
9. e.printStackTrace();
10. }
11. return obj;
12.
13. }
14. } public class Something implements Cloneable{
private Something obj;
public Something cloneSomething()
{
try {
obj = (Something)this.clone();
// obj = (Something)clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return obj;
}
} 如果需要复制上面的那个obj指向的对象实例时,调用somethingNew.cloneSomething()方法就ok了。但是为什么不直接使用somethingNew.clone()呢?JDK中Object# clone()方法的原型是:
protected native Object clone() throws CloneNotSupportedException;方法修饰符是protected,而不是public。这种访问的不可见性使得我们对Object#clone()方法不可见。所以,必需重写Object的clone方法后才能使用。
Java代码 1. public Object clone()throws CloneNotSupportedException
2. {
3. Something obj;
4. obj= (Something)super.clone();
5. return obj;
6. } public Object clone()throws CloneNotSupportedException
{
Something obj;
obj= (Something)super.clone();
return obj;
} 值得注意的是 :如果需要使用clone方法,必需实现java.lang.Cloneable接口,否则会抛出java.lang.CloneNotSupportedException。另外clone方法所做的的操作是直接复制字段的内容,换句话说,这个操作并不管该字段对应的对象实例内容。像这样字段对字段的拷贝(field to field copy)就成为"浅拷贝",clone方法所做的正是"浅拷贝". 3.newInstance利用java.lang.Class类的newInstance方法,则可根据Class对象的实例,建立该Class所表示的类的对象实例。创建Something类的对象实例可以使用下面的语句(这样需要一个已经存在的对象实例)。
Java代码 1. somethingNew.getClass().newInstance(). somethingNew.getClass().newInstance(). 或者使用下面的语句(只需要存在相应的.class文件即可)
Java代码 1. Something instance = (Something) Class.forName("cn.softkid.test.Something").newInstance(); Something instance = (Something) Class.forName("cn.softkid.test.Something").newInstance(); 如果包下不存在相应.class文件,则会抛出ClassNotFoundException。注意 :newInstance创建对象实例的时候会调用无参的构造函数,所以必需确保类中有无参数的构造函数,否则将会抛出java.lang.InstantiationException异常。无法进行实例化。
静态的类就不用new 了 直接可以调用方法
java.lang.String str = "string" ;一些如Integer之类的可以这么来:
Long l = 12L;哈哈哈
2.Class或者java.lang.reflect.Constructor对象的newInstance()
3.java.io.ObjectInputStream类的getObject()反序列化具体的可以看8楼,讲得挺清楚
2.Class或者java.lang.reflect.Constructor对象的newInstance()
3.java.io.ObjectInputStream类的getObject()反序列化
4,用自定义的classloader从.class文件中load二进制数据,得到Class定义,然后再通过newInstance实例化.container就是这样做的,比如servlet的初始化.
1,用new
2,运用放射的手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法
3,调用对象的clone()方法
4,运用反序列化的手段,调用java.io.ObjectInputStream对象的readObject()方法。
package class7_3;public class Singleton {
/**
* 单子模式 【Singleton】
* 创建一个类,要满足:
*
* 1.构造器私有。
* 2.用一个私有、静态变量引用实例。
* 3.提供一个共有、静态方法获得实例。
*/
//way 1.构造器私有。
private Singleton(){
r = java.lang.Math.random();
}
//way 2.定义一个私有、静态的引用变量。
private static Singleton s;
//way 3.提供一个共有、静态方法获得唯一实例。
public static Singleton getInstance(){
if(s==null){
s = new Singleton();
}
return s;
}
//**********************************************************************************
private double r; public double getR() {
return r;
} public void setR(double r) {
this.r = r;
}
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1.getR());
System.out.println(s2.getR());
}
}
new
clone
反射