`
zhaohaolin
  • 浏览: 991865 次
  • 性别: 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();
            }

    }

}

分享到:
评论

相关推荐

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

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

    Java中怎样由枚举常量的ordinal值获得枚举常量对象

    Java1.5提供了关键字enum,能够通过该关键字方便得定义自己须要的枚举类型,比方  enum Season { ...也是说,使用name()方法和valueOf(String)方法能够在枚举类型对象和字符串之间方便得转换。当然,假设valu

    Struts2在Action中获得Response对象的四种方法

    Struts2获得Response对象的四种方法 Struts2 是一个基于MVC 模式的 Web 应用程序框架,它提供了多种方式来获取 Response 对象,以下是四种获得 Response 对象的方法: 方法 1:使用 Struts2 Aware 拦截器 在 ...

    《Java面向对象程序设计》(第版)课后答案.docx

    《Java面向对象程序设计》(第版)课后答案 39 / 39 《Java面向对象程序设计》(第版)课后答案全文共39页,当前为第1页。《Java面向对象程序设计》(第版)课后答案全文共39页,当前为第1页。Java面向对象程序设计 《Java...

    java集合对象

    java集合对象 介绍集合对象  Set:集----存储数据无序,所以不能存储相同的数据,set在存储数据方面有优势  List:列表-----存储数据有序,所以可以存储相同的数据,list在向集合对象中的指定位置添加数据和得到...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式...

    基于反射机制实现Java对象向Json数据的转换.pdf

    本文将讨论基于反射机制实现Java对象向Json数据的转换的原理和方法。 一、JSON概述 JSON是一种轻量级的数据交换格式,易于人阅读和编写。它是JavaScript的一个子集,采用完全独立于编程语言的文本格式。JSON的特性...

    java面向对象程序设计习题-(11).doc

    第四章 类和对象 [习题] 1.类及类成员的访问控制符有哪些? 2.为什么说构造函数是一种特殊的方法?特殊在哪里?构造函数什么时候执行?被谁调 用? 3.关键字static可以修饰哪些类的组成部分? 4.静态属性有什么特点?...

    实验03 Java面向对象编程1.doc

    ○3创建分别获得各域(学号,姓名,性别和年龄)的public方法,以及分别设置各域(学号,姓名,性别和年龄)值的public方法(即get、set方法);另外还要创建获取静态域count值的get方法; ○4创建public型的...

    Java面向对象程序设计.doc

    Java面向对象程序设计知识点总结 ...本文详细介绍了Java面向对象程序设计的基本概念和方法,包括对象、类、封装、继承、多态、类的使用方法、对象的创立与使用方法、包的创立与使用方法等知识点。

    Java技术及其应用 02 面向对象结构(共106页).ppt

    Java是真正面向对象的编程语言 面向对象编程主要体现下列三个特性: ◇封装性 (Encapsulation) ... 学习面向对象编程首先就要学习怎样通过抽象得到类,即怎样将某些数据以及和数据有关的操作封装在一起。

    Java语言程序设计(第二版)\第04章 面向对象编程.ppt

    Java编程就是设计类,可以采用自定义方法或继承方法设计一个类,然后使用它的实例对象完成具体的功能。 5. 继承 继承是面向对象编程的基本特性之一,继承使父类的代码得到重用,在继承父类提供的共同特性基础上...

    Java生成PublicKey方法

    Java 生成 PublicKey 方法 Java 生成 PublicKey 方法是 Java 开发语言中一个重要的知识点,本文将对其进行详细的讲解。 首先,需要了解什么是 PublicKey?PublicKey 是一种加密算法中使用的公钥,用于加密和解密...

    Java反射机制,通过对象访问调用类的私有成员或方法

    Java反射机制,万物皆对象,class也是一个类的对象,通过类类型,反射获得类的成员属性,构造方法,成员方法,并调用类中的方法,也可以调用私有方法。

    java源码包---java 源码 大量 实例

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java 通过反射获取类上注解,方法上注解,注解里的值及方法参数

    java 通过反射获取类上注解,方法上注解,注解里的值及方法参数,项目为maven项目。导入时记得选择maven项目

    AXIS2中OMElement和Java对象之间的转换

    在上面的方法中,我们使用了 BeanUtil 工具类将 Java 对象转换为 XMLStreamReader,然后使用 StAXOMBuilder 将其转换为 OMElement。这样,我们就可以将 Java 对象转换为 OMElement,以便在 AXIS2 中使用。 AXIOM 还...

    2023年Java面向对象程序设计.doc

    在 Java 中,面向对象程序设计(Object-Oriented Programming, OOP)是一种编程范式,它将程序视为一组相互作用的对象集合。每个对象都代表一个实体,具有其属性和方法。面向对象程序设计的主要特征包括封装、继承、...

    Java面向对象精髓编程

    这里有很全的java基础知识的详细讲解,通俗易懂,很适合初学者的学习。工作中的java工程师参考也会从中得到收益。

Global site tag (gtag.js) - Google Analytics