ByteArrayInputStream copy = (ByteArrayInputStream) original.clone();报错’clone()’ has protected access in ‘java.lang.Object’该怎么解决
时间: 2024-09-28 09:17:00 浏览: 27
`clone()` 方法默认在 `Object` 类中是受保护访问权限的,这意味着它不能直接被子类或非自身类型的对象调用。如果你想要复制 `ByteArrayInputStream` 对象,并期望像操作原始对象一样操作副本,你需要显式地将 `original` 转换为其子类的实例,然后调用它的 `clone()` 方法。
```java
// 确保你知道要转换成哪种具体的字节数组输入流类型,比如ByteBufferInputStream、DirectByteArrayInputStream等
BufferedInputStream buffer = new BufferedInputStream(original);
byte[] byteArray = IOUtils.toByteArray(buffer); // 使用IO工具类将流内容复制到数组
ByteArrayInputStream copy = new ByteArrayInputStream(byteArray);
```
这里没有直接使用 `clone()`,而是先通过其他方式进行数据复制,然后再创建一个新的 `ByteArrayInputStream`。如果 `original` 实际上就是 `ByteArrayInputStream`,那么这种方法就适用。
相关问题
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class StorageListen{ private static PropertiesMessage filteredRealtimeData = new PropertiesMessage(); private PeriodStorage periodStorage; @Scheduled(cron="*/1 * * * * ?") @Async("PeriodStorage") public void periodStorage(){ PropertiesMessage clone = (PropertiesMessage)filteredRealtimeData.clone(); Map<String,List<StorageConfig>> map = new HashMap(); List<StorageConfig> list = new ArrayList(); StorageConfig s1 = new StorageConfig(); s1.setValue("1"); StorageConfig s2 = new StorageConfig(); s2.setValue("1"); list.add(s1); list.add(s2); map.put("1",list); periodStorage.storageData(clone); } } @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PeriodStorage { private static DeviceProperties filteredRealtimeData = new DeviceProperties(); public void storageData(PropertiesMessage message,Map<String,List<StorageConfig>> map){ map.entrySet().stream().forEach(k -> { k.getValue().parallelStream().forEach(y -> { DeviceProperties clone = (DeviceProperties)filteredRealtimeData.clone(); }) }) } } @Data public class PropertiesMessage implements Serializable { public Map<String, DeviceProperties> propertiesMap; public PropertiesMessage deepClone() { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (PropertiesMessage) ois.readObject(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); return null; } } } public class DeviceProperties implements Serializable { public String value; public DeviceProperties deepClone() { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (DeviceProperties) ois.readObject(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); return null; } } } @Data public class StorageConfig{ public String value; }
这段代码中的StorageListen类中有一个periodStorage方法,使用@Scheduled注解和@Async注解标记,表示该方法会在固定的时间间隔内执行,并且会在异步线程中执行。该方法会将filteredRealtimeData对象进行克隆,然后将克隆后的对象传递给PeriodStorage类中的storageData方法进行处理。在storageData方法中,会对传递进来的map进行遍历,然后对每个元素进行克隆,并进行相应的处理。
在这段代码中,使用了深克隆的方式来复制对象,以避免修改原始对象。同时,在StorageConfig和DeviceProperties类中也实现了deepClone方法,以支持深克隆。这样可以确保在进行对象复制时,所有的字段都会被正确地复制,并且不会对原始对象造成影响。
需要注意的是,在使用深克隆的方式复制对象时,需要确保对象中的所有字段都是可序列化的,否则会导致克隆失败。此外,由于深克隆需要进行对象的序列化和反序列化操作,因此可能会对性能产生一定的影响,需要在性能和正确性之间进行权衡。
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class StorageListen{ private static PropertiesMessage filteredRealtimeData = new PropertiesMessage(); private PeriodStorage periodStorage; @Scheduled(cron="*/1 * * * * ?") @Async("PeriodStorage") public void periodStorage(){ PropertiesMessage clone = (PropertiesMessage)filteredRealtimeData.clone(); Map<String,List<StorageConfig>> map = new HashMap(); List<StorageConfig> list = new ArrayList(); StorageConfig s1 = new StorageConfig(); s1.setValue("1"); StorageConfig s2 = new StorageConfig(); s2.setValue("1"); list.add(s1); list.add(s2); map.put("1",list); periodStorage.storageData(clone); } } @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PeriodStorage { private static DeviceProperties filteredRealtimeData = new DeviceProperties(); public void storageData(PropertiesMessage message,Map<String,List<StorageConfig>> map){ map.entrySet().stream().forEach(k -> { k.getValue().parallelStream().forEach(y -> { DeviceProperties clone = (DeviceProperties)filteredRealtimeData.clone(); System.out.println(y.toString()); System.out.println(clone.toString()); }) }) } } @Data public class PropertiesMessage implements Serializable { public Map<String, DeviceProperties> propertiesMap; public PropertiesMessage deepClone() { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (PropertiesMessage) ois.readObject(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); return null; } } } public class DeviceProperties implements Serializable { public String value; public DeviceProperties deepClone() { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (DeviceProperties) ois.readObject(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); return null; } } } @Data public class StorageConfig{ public String value; }
这段代码中,有两个类:`StorageListen`和`PeriodStorage`,以及两个数据类:`PropertiesMessage`和`DeviceProperties`,还有一个辅助类`StorageConfig`。
`StorageListen`中定义了一个定时任务`periodStorage()`,每一秒钟执行一次,该方法会将`filteredRealtimeData`进行深拷贝,然后将深拷贝的数据传递给`PeriodStorage`的`storageData()`方法进行存储。在`periodStorage()`方法中,还定义了一个`Map`,用于存储`StorageConfig`对象的列表,列表中存储了两个`StorageConfig`对象,每个`StorageConfig`对象中都有一个`value`属性,值为"1"。
`PeriodStorage`中定义了一个`storageData()`方法,用于存储数据。该方法接收两个参数:一个`PropertiesMessage`对象和一个`Map`对象。在该方法中,根据`Map`中的数据进行遍历,遍历时会对每一个`StorageConfig`对象进行并行处理。在并行处理中,首先将`DeviceProperties`对象进行深拷贝,然后输出当前`StorageConfig`对象和深拷贝后的`DeviceProperties`对象的信息。
`PropertiesMessage`和`DeviceProperties`均实现了`Serializable`接口,并且都定义了一个`deepClone()`方法,用于进行深拷贝操作,以避免在对数据进行修改时影响原始数据。`StorageConfig`类中只有一个`value`属性,用于存储数据。