`
zhaohaolin
  • 浏览: 1020009 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

四种得到java对象的方法

    博客分类:
  • 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();
            }

    }

}

分享到:
评论

相关推荐

    xml和java对象互相转换的两种方法

    本文将详细介绍两种主要的XML与Java对象互相转换的方法:DOM(Document Object Model)解析和JAXB(Java Architecture for XML Binding)。 1. DOM解析: DOM是一种W3C标准,它将XML文档解析成一棵由节点组成的树,...

    Excel列表转化成java对象

    通过逐行读取文件,然后按逗号分割每一行得到字段,我们可以轻松地将数据映射到Java对象。 然后,提到的"jaxb"技术,全称Java Architecture for XML Binding,是Java标准中用于XML到Java对象和Java对象到XML的绑定...

    java 子类对象赋值给父类对象的使用

    通过以上讨论,我们可以看到,Java中子类对象赋值给父类对象是一种强大且灵活的设计模式,它允许我们在代码中使用抽象的父类引用,从而简化编程,增加代码的通用性和可维护性。在实际项目中,合理利用这一特性,能够...

    JAVA对象与XML互转

    2. **DOM解析**:解析XML文件得到DOM树,然后遍历树并创建相应的Java对象。这通常需要手动编写解析代码,比较繁琐。 3. **SAX解析**:Simple API for XML(SAX)是一种事件驱动的解析方式,适合处理大型XML文件。当...

    java-对象数组转换为json

    然后,调用`toArray()`方法将`JSONArray`转换为指定类型的Java对象数组`mProperties`。最后,遍历数组并打印出每个对象的属性值。 ### 使用`org.json`库 在上述代码片段中,虽然使用了`org.json`库,但实际上`org....

    实验三:Java类与对象

    函数重载是Java中允许同一方法名但参数列表不同的多个方法存在,这在`Rectangle`类中得到了体现,我们创建了两个方法:`getLength()`和`getArea()`,它们虽然都无参数,但返回类型不同,实现了功能上的区分。...

    Java对象和类 最详细说明

    ### Java对象和类 最详细说明 #### 一、Java中的对象 在面向对象编程中,对象是核心概念之一。对象可以被理解为现实世界中事物的抽象表示,它具有特定的状态(属性)和行为(方法)。例如,一辆汽车可以被视为一个...

    java复数四则运算-类的定义与对象.rar

    complexAdd(ComplexNumber c):当前复数对象与形式参数复数对象相加,所得的结果也是复数值,返回给此方法的调用者。 complexAdd(double c):当前复数对象与形式参数实数对象相加,所得的结果仍是复数值,返回给此...

    java对象生成xml数据

    JAXB(Java Architecture for XML Binding)是Java提供的一种标准API,它允许开发者轻松地在Java对象和XML文档之间进行映射。在这个过程中,`JAXBContext`和`Marshaller`扮演了关键角色。 `JAXBContext`是JAXB的...

    面向对象与Java实现(类、对象、构造方法

    在Java中,面向对象编程得到了广泛的应用和支持,以下将深入探讨类、对象以及构造方法在Java中的实现。 ### 1. 面向对象的基本概念 #### 1.1 属性与方法 在面向对象中,我们关注的是对象的状态和行为。**属性**...

    Java面向对象五子棋

    Java面向对象编程是一种重要的软件开发方法,它基于“对象”的概念,强调数据和操作数据的方法紧密结合,使得代码更易于理解和维护。在这个名为“Java面向对象五子棋”的项目中,我们有两个使用Java实现的五子棋小...

    json转对象数组与对象数组转json --Java

    4. **转换为Java对象**:使用`JSONSerializer.toJava()`方法将`JSONArray`转换为指定类型的Java对象数组。 下面是一个示例代码: ```java import org.json.JSONArray; import net.sf.json.JsonConfig; import ...

    《Java面向对象程序设计(第2版)》课件

    Java面向对象程序设计是计算机科学中的一个重要领域,尤其在软件开发中占据核心地位。第二版的《Java面向对象程序设计》课件旨在深入浅出地介绍这一关键概念,帮助学习者掌握Java语言的基础以及面向对象编程的核心...

    实用Java教程(书上源代码)基于BlueJ的对象优先方法(第三版)

    《实用Java教程(书上源代码)基于BlueJ的对象优先方法(第三版)》是一本深受Java初学者欢迎的教材,由David J. Barnes和Michael Kolling共同编写,并得到了Java之父James Gosling的倾情推荐。这本书的核心理念是通过...

    java 反射得到某个方法

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。通过反射,我们可以在不知道具体类名或方法名的情况下,动态地调用对象的方法或访问其属性。在...

    使用json-lib将java对象转换成json字符串

    例如,使用`net.sf.json.JSONObject.fromObject()`方法可以将Java对象转换成JSONObject,再调用`toString()`即可得到JSON字符串。 2. **json-lib库介绍**: - json-lib是Java平台上的一个开源项目,用于处理JSON...

    java面向对象理解

    "java面向对象理解" Java 面向对象编程是 Java 语言的核心概念之一。...Java 面向对象编程是一种强大的编程范式,能够帮助程序员更好地模拟现实世界中的对象交互,提高代码的可维护性和可重用性。

    java 构造方法的资源

    在Java编程语言中,构造方法(Constructor)是一个特殊的方法,它的主要作用是初始化新创建的对象。构造方法与类名相同,没有返回类型,也不需要在方法签名中声明void。了解和熟练使用构造方法是Java面向对象编程的...

    java面向对象应用程序开发

    5. **观察者模式(Observer)**:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。 在实际的Java应用程序开发中,理解并熟练运用这些面向对象的概念...

    Java面向对象总结

    1. **子类继承父类就拥有了父类的属性和方法**:当一个类(子类)继承另一个类(父类)时,子类自动获得了父类的所有非私有的成员变量和成员方法,这种机制极大地提高了代码的复用性和维护性。 2. **父类的构造...

Global site tag (gtag.js) - Google Analytics