#java #gson #blockchain
Вопрос:
Я пытаюсь запустить свою блокчейн-программу java и распечатать выходные данные в формате JSON (используя библиотеку gson).
package blockchain;
import java.util.ArrayList;
import com.google.gson.GsonBuilder;
import com.google.gson.*;
import java.sql.Time;
public class NoobChain {
public static ArrayList<Block> blockchain = new ArrayList<Block>();
//main method
public static void main(String[] args) {
blockchain.add(new Block("Hi im the first block", "0"));
blockchain.add(new Block("Yo im the second block",blockchain.get(blockchain.size()-1).hash));
blockchain.add(new Block("Hey im the third block",blockchain.get(blockchain.size()-1).hash));
String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);
System.out.println(blockchainJson);
}
//check blockchain's validity
public static Boolean isChainValid() {
Block currentBlock;
Block previousBlock;
//loop through blockchain to check hashes:
for(int i=1; i < blockchain.size(); i ) {
currentBlock = blockchain.get(i);
previousBlock = blockchain.get(i-1);
//compare registered hash and calculated hash:
if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){
System.out.println("Current Hashes not equal");
return false;
}
//compare previous hash and registered previous hash
if(!previousBlock.hash.equals(currentBlock.previousHash) ) {
System.out.println("Previous Hashes not equal");
return false;
}
}
return true;
}
}
вот мой module-info.java. это находится за пределами блокчейна пакета
module noobChain {
requires gson;
requires java.sql;
}
Я получаю эту ошибку:
Exception in thread "main" java.lang.reflect.InaccessibleObjectException: Unable to make field public java.lang.String blockchain.Block.hash accessible: module noobChain does not "exports blockchain" to module gson
Есть какие-нибудь мысли? Я импортировал банку gson в свой путь к классу в eclipse
Ответ №1:
Если вы не укажете пользователь TypeAdapter
, вместо этого Gson будет использовать адаптер на основе отражения (что, похоже, имеет место здесь). Поэтому (как указано в сообщении об исключении) вам необходимо разрешить модулю Gson доступ к вашим классам с помощью отражения. Вы можете либо решить эту проблему, добавив exports blockchain to com.google.gson;
в свой module-info.java
файл (как указано в сообщении об исключении), либо, поскольку для Gson требуется только доступ во время выполнения, его достаточно использовать opens blockchain to com.google.gson;
.
Однако, если у вас есть большое количество пакетов, которые должны быть доступны для Gson, вы также можете открыть свой полный модуль для доступа во время выполнения ко всем модулям путем записи open module noobChain { ... }
.
См.также «Понимание модулей Java 9» для получения дополнительной информации.
Некоторые дополнительные незначительные примечания:
requires gson;
Какую версию Gson вы используете? В последних версиях Gson используется имя модуля com.google.gson
(см. Источник).
requires java.sql;
Если для вашего кода не требуется java.sql
модуль, вы можете удалить его. Начиная с Gson 2.8.9, зависимость от java.sql
модуля необязательна, и Gson также должен нормально работать без него.