自定义动态添加字段内容的库类

  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};
		}
	}
	//输出内容
	@Override
	public 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于使用 Java EasyExcel 库进行自定义样式和字段导出,我可以给您一些指导。 首先,让我们来讨论如何自定义样式。EasyExcel 提供了丰富的样式设置选项,可以通过创建 StyleStrategy 并为其添加样式来实现自定义。下面是一个简单的示例代码: ```java // 创建自定义样式策略 WriteCellStyle cellStyle = new WriteCellStyle(); // 设置背景颜色 cellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex()); // 设置字体样式 WriteFont font = new WriteFont(); font.setFontHeightInPoints((short) 12); font.setBold(true); cellStyle.setWriteFont(font); // 创建写入 Excel 的相关参数 String fileName = "output.xlsx"; String sheetName = "Sheet1"; List<List<Object>> data = new ArrayList<>(); // 添加数据... // 导出 Excel ExcelWriter excelWriter = EasyExcel.write(fileName) .registerWriteHandler(new HorizontalCellStyleStrategy(cellStyle)) .build(); WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build(); excelWriter.write(data, writeSheet); excelWriter.finish(); ``` 上述代码中,我们通过创建 WriteCellStyle 对象来设置单元格样式,并将其添加到 StyleStrategy(这里使用的是 HorizontalCellStyleStrategy)中,然后注册到 ExcelWriter 中,以应用于特定的单元格。 此外,EasyExcel 还提供了更多的样式设置选项,比如字体、边框、对齐方式等,您可以根据具体需求进行设置。 接下来,我们讨论如何实现自定义字段导出。EasyExcel 支持通过注解来标识需要导出的字段,您可以在实体类的属性上添加相应的注解来指定字段的导出样式和格式。以下是一个示例: ```java public class User { @ExcelProperty(value = "姓名", index = 0) private String name; @ExcelProperty(value = "年龄", index = 1) private Integer age; // 其他属性... // Getter 和 Setter 省略 } ``` 在上述示例中,我们使用 @ExcelProperty 注解来标识 name 和 age 字段需要导出到 Excel 中,并指定了对应的列名和索引位置。 然后,您可以使用 EasyExcel 的 write 方法来导出数据到 Excel: ```java String fileName = "output.xlsx"; String sheetName = "Sheet1"; List<User> userList = new ArrayList<>(); // 添加数据... // 导出 Excel EasyExcel.write(fileName, User.class) .sheet(sheetName) .doWrite(userList); ``` 上述代码中,我们将用户列表作为数据源,并使用 User.class 来指定实体类,以便 EasyExcel 自动识别需要导出的字段。 希望以上信息对您有所帮助!如有更多疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值