四种得到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、付费专栏及课程。

余额充值