四种得到java对象的方法


    new一个对象可能非常熟悉,但由于反序列化,反射,克隆在开发中用得不多,有些会生疏。

    先定义一个简单的HelloBean,他有一个接口IHelloBean,还有会抛出异常NullNameException。

package  com.kompakar.tutorial.object.common;

import  java.io.Serializable;

// 接口继承Cloneable,Serializable,可以用来克隆和序列化
public   interface  IHelloBean  extends  Cloneable,Serializable {

    String echoHello(String name) 
throws NullNameException;
    IHelloBean clone() 
throws CloneNotSupportedException;
    String getName();
    
}


HelloBean实现IHelloBean实现方法
package  com.kompakar.tutorial.object.common.impl;

import  com.kompakar.tutorial.object.common.IHelloBean;
import  com.kompakar.tutorial.object.common.NullNameException;

public   class  HelloBean  implements  IHelloBean  {

    
private static final long serialVersionUID = 7694044778894190986L;
    
private String name ;
    
    
public HelloBean(){
        
    }


    
public HelloBean(String name){
        
this.name = name;
    }

    
    
//具体的业务方法
    @Override
    
public String echoHello(String name) throws NullNameException {

        
if(name != null && name.length() > 0){
            
return "Hello," + name + "!";
        }
else{
            
throw new NullNameException("Null Name Exception");
        }

    }

    
    
//利用Object.clone()实现克隆
    @Override
    
public HelloBean clone() throws CloneNotSupportedException {
        
        
return (HelloBean) super.clone();
    }


    
public String getName() {
        
return name;
    }


    
public void setName(String name) {
        
this.name = name;
    }

    
    
}


自定义的业务异常,和得到对象没有关系
package  com.kompakar.tutorial.object.common;

public   class  NullNameException  extends  Exception  {

    
private static final long serialVersionUID = -8862603561913984398L;

    
public NullNameException(String message) {
         
super(message);
    }

    
}


我想new一个对象不用说,在这里还是写一下:
package  com.kompakar.tutorial.object.newo;

import  com.kompakar.tutorial.object.common.IHelloBean;
import  com.kompakar.tutorial.object.common.NullNameException;
import  com.kompakar.tutorial.object.common.impl.HelloBean;

public   class  NewObjectTest  {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {

        
//得到对象
        IHelloBean helloBean = new HelloBean();
        
try {
            
//调用业务方法
            String msg = helloBean.echoHello("Allen");
            
//打印出返回的消息
            System.out.println(msg);
        }
 catch (NullNameException e) {
            System.out.println(e.getMessage());
        }


    }


}



序列化/反序列化的过程是先将对象按照特定的规范,将对象序列化,形成一个可以存储传输的流。反序列化就是将该流转变成对象。
package  com.kompakar.tutorial.object.objectstream;

import  java.io.FileInputStream;
import  java.io.FileNotFoundException;
import  java.io.FileOutputStream;
import  java.io.IOException;
import  java.io.ObjectInputStream;
import  java.io.ObjectOutputStream;

import  com.kompakar.tutorial.object.common.IHelloBean;
import  com.kompakar.tutorial.object.common.NullNameException;
import  com.kompakar.tutorial.object.common.impl.HelloBean;

public   class  SerializTest  {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        
//得到对象
        IHelloBean helloBean = new HelloBean("Benewu");
        
try {
            
//将对象写到本地,可以在磁盘中发现HelloBean.dat文件
            ObjectOutputStream objout = new ObjectOutputStream(new FileOutputStream("HelloBean.dat"));
            objout.writeObject(helloBean);
            objout.close();
            
            
//将本地的HelloBean.dat文件取出来并且转成对象
            ObjectInputStream objin = new ObjectInputStream(new FileInputStream("HelloBean.dat"));
            IHelloBean aHelloBean 
= (IHelloBean) objin.readObject();
            objin.close();
            
            String msg 
= aHelloBean.echoHello("Allen");
            System.out.println(aHelloBean.getName());
            System.out.println(msg);
        }
 catch (FileNotFoundException e) {
            e.printStackTrace();
        }
 catch (IOException e) {
            e.printStackTrace();
        }
catch(ClassNotFoundException e){
            e.printStackTrace();
        }
catch(NullNameException e){
            e.printStackTrace();
        }

    }

}


利用Object.clone()可以得到一个深度克隆的对象。
package  com.kompakar.tutorial.object.cloneo;

import  com.kompakar.tutorial.object.common.IHelloBean;
import  com.kompakar.tutorial.object.common.NullNameException;
import  com.kompakar.tutorial.object.common.impl.HelloBean;

public   class  CloneTest   {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {

        IHelloBean helloBean 
= new HelloBean();
        
try {
            IHelloBean helloBeanClone 
= helloBean.clone();
            System.out.println(helloBeanClone.echoHello(
"Bene"));
        }
 catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
catch(NullNameException e){
            System.out.println(e.getMessage());
        }

        
    }


}



反射使用得比较多, 可以利用XML定义类型和参数,在使用的时候再动态加载。
package  com.kompakar.tutorial.object.reflectiono;

import  java.lang.reflect.InvocationTargetException;
import  java.lang.reflect.Method;

import  com.kompakar.tutorial.object.common.IHelloBean;
import  com.kompakar.tutorial.object.common.NullNameException;

public   class  ReflectionTest  {

    
/**
     * 
@param args
     * 
@throws InvocationTargetException 
     * 
@throws  
     * 
@throws NoSuchMethodException 
     * 
@throws SecurityException 
     
*/

    
public static void main(String[] args)  {
        
try {
            
//定义对象类型
            Class c= Class.forName("com.kompakar.tutorial.object.common.impl.HelloBean");
            Object obj;
            
//得到对象实例并且直接调用业务方法
            obj = c.newInstance();
            IHelloBean helloBean 
= (IHelloBean)obj;
            String msg 
= helloBean.echoHello("Baby");
            System.out.println(msg);
            
            
//在这里可能永远都不知道方法名字是什么,而是动态加载进来,并进行访问
            
//动态调用业务方法
            Class sc = Class.forName("java.lang.String");
            Method m 
= c.getMethod("echoHello"new Class[]{sc});
            Object returnObj 
= m.invoke(helloBean, "GIGI");
            System.out.println((String)returnObj);
            
            }
 catch (InstantiationException e) {
                e.printStackTrace();
            }
 catch (IllegalAccessException e) {
                
// TODO Auto-generated catch block
                e.printStackTrace();
            }
 catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
catch (NullNameException e) {
                System.out.println(e.getMessage());
            }
 catch(SecurityException e){
                e.printStackTrace();
            }
catch(NoSuchMethodException e){
                e.printStackTrace();
            }
catch(IllegalArgumentException e){
                e.printStackTrace();
            }
catch(InvocationTargetException e){
                e.printStackTrace();
            }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值