四种得到java对象的方法

    技术2022-05-11  75

    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();            }    }}

    最新回复(0)