自定义动态添加字段内容的库类
来源:互联网 发布:java nio列子 编辑:程序博客网 时间:2024/06/06 19:37
Java不少类可以通过Set方法动态向对象添加新的字段内容,这里面如何实现这功能且代码质量较高呢?这里我参照thinking in java的书籍,自定义一个可以在运行时动态的添加字段内容。
//自定义异常class DynamicFieldsException extends Exception {}public class DynamicFields{private Object[][] fields;//初始化保存字段内容的数组public DynamicFields(int initialSize){fields=new Object[initialSize][2];for(int i=0;i<fields.length;i++){fields[i]=new Object[]{null,null};}}//输出内容@Overridepublic String toString(){StringBuilder result=new StringBuilder();for(Object[] filed:fields){result.append(filed[0]);result.append(":");result.append(filed[1]);result.append("\n");}return result .toString();}//查询该字段内容是否已存在private int hasField(String id){for(int i=0;i<fields.length;i++){if(id.equals(fields[i][0]))return i;}return -1;}private int getFieldNumber(String id) throws NoSuchFieldException{int fieldNum=hasField(id);if(fieldNum==-1)throw new NoSuchFieldException();return fieldNum;}private int makeField(String id){for(int i=0;i<fields.length;i++){if(fields[i][0]==null){fields[i][0]=id;return i;}}//如果数组内存已满,则重新开辟一个内存更大的数组,这里我只加一个字段内存Object[][] objects=new Object[fields.length+1][2];//拷贝字段内容for(int i=0;i<fields.length;i++){objects[i]=fields[i];}for(int i=fields.length;i<objects.length;i++){objects[i]=new Object[]{null,null};}//赋给新开辟数组内存的引用地址fields=objects;return makeField(id);}public Object getField(String id)throws NoSuchFieldException{return fields[getFieldNumber(id)][1];}public Object setField(String id,Object value)throws DynamicFieldsException{if(value==null){DynamicFieldsException fieldsException=new DynamicFieldsException();//保留最原始异常信息fieldsException.initCause(new NullPointerException());throw fieldsException;}int fieldNumber=hasField(id);if(fieldNumber==-1){fieldNumber=makeField(id);}Object result=null;try{//获取原来的字段内容result=getField(id);} catch (NoSuchFieldException e){//保留原来异常信息throw new RuntimeException(e);}//更新字段内容fields[fieldNumber][1]=value;return result;} public static void main(String[] args) { DynamicFields df = new DynamicFields(3); System.out.println(df); try { df.setField("d", "A value for d"); df.setField("number", 47); df.setField("number2", 48); System.out.println(df); df.setField("d", "A new value for d"); df.setField("number3", 11); System.out.println("df: " + df); System.out.println("df.getField(\"d\") : " + df.getField("d")); //这里将会抛出异常 Object field = df.setField("d", null); } catch(NoSuchFieldException e) { e.printStackTrace(System.out); } catch(DynamicFieldsException e) { e.printStackTrace(System.out); }}}运行结果:
null:null
null:null
null:null
d:A value for d
number:47
number2:48
df: d:A new value for d
number:47
number2:48
number3:11
df.getField("d") : A new value for d
beyondboy.DynamicFieldsException
at beyondboy.DynamicFields.setField(DynamicFields.java:80)
at beyondboy.DynamicFields.main(DynamicFields.java:119)
Caused by: java.lang.NullPointerException
at beyondboy.DynamicFields.setField(DynamicFields.java:82)
... 1 more
0 0
- 自定义动态添加字段内容的库类
- 添加jira的自定义字段
- 在drupal7中动态的为某个内容类型添加字段
- DataGrid 自定义字段内容
- dede自定义添加字段的调用
- sql动态添加字段
- sql动态添加字段
- 动态的给下拉列表添加内容
- jquery结合js实现动态添加内容,并给动态添加的内容添加事件
- 给phpcms v9专题添加一个radio单选按钮,可以多次利用专题创建不同的栏目进行内容编辑,给专题添加一个自定义字段
- 动态添加html内容
- 1.4 添加动态内容
- Fragment动态添加内容
- fieldset动态添加内容
- 动易首页调用自定义字段内容的修改方法
- WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容
- Android 动态添加自定义式样的按钮
- dedecms栏目添加字段--栏目自定义字段
- JAVASE--GUI图形用户界面、网络编程
- Android 5.0中AudioPatch概念简单探索
- MacBook Pro光驱常年不用,光驱不吸盘,光盘塞不进去了。咋办?
- 微信红包游戏,代码模拟
- 跨平台移动开发实战(一)------总体架构和技术路线
- 自定义动态添加字段内容的库类
- c++11多线程与POSIX多线程性能比较
- JAVASE--正则表达式、反射技术
- FrontEnd 步步高升:bootstrap3-validation.js 必填项星号(*)显示方式修改
- 从网络url读取图片加载到imageview
- POJ题目1840 Eqs(hash)
- js中几种实用的跨域方法原理详解
- spring mvc controller间跳转 重定向 传参
- Java(7)异常/包及访问权限/多线程/泛型