Не удалось сделать поле общедоступным java.lang.Блокчейн строк.Блок.хэш доступен: модуль noobChain не «экспортирует блокчейн» в модуль gson

#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 также должен нормально работать без него.