无法使字段公开java.lang.String区块链.Block.hash可访问:模块noobChain没有将区块链“导出”到模块gson

vsaztqbk  于 2022-11-06  发布在  Java
关注(0)|答案(1)|浏览(164)

我正在尝试运行我的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;
        }
    }

这是我的模块-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

有什么想法吗?我已经在eclipse中将gson jar导入到我的类路径中了

kzmpq1sx

kzmpq1sx1#

如果不指定自定义的TypeAdapter,Gson将使用基于反射的适配器(这里似乎是这样)。因此(正如异常消息所暗示的那样)您需要允许Gson模块使用反射来访问您的类。(如异常消息所建议的),或者,因为Gson只需要运行时访问,所以使用opens blockchain to com.google.gson;就足够了。
然而,如果你有大量的包需要Gson访问,你也可以通过写open module noobChain { ... }来打开你的完整模块,以便在运行时访问所有模块。
有关详细信息,另请参阅“Understanding Java 9 Modules“。
一些附加的小注意事项:
requires gson;
您使用的是哪个Gson版本?最近的Gson版本使用的模块名称是com.google.gson(参见源代码)。
requires java.sql;
除非你的代码需要java.sql模块,否则你可以删除它。从Gson 2.8.9开始,对java.sql模块的依赖是可选的,Gson在没有它的情况下也能正常工作。

相关问题