0

I am trying to generate the wrapper on fly using web3j and invoking a method on the generated class using reflection. But I am getting classNotFound exception on the first try. (When I stop the server and re-run, it works because the class was already present)

Does java support generating class on fly (when server is running) ?

 private void createContractClass(String contractFileNameWithoutExtension) {
        try {
            String command = "web3j solidity generate -b " +
                    contractLocation+contractFileNameWithoutExtension+".bin  -a "+contractLocation+contractFileNameWithoutExtension+".abi" +
                    " -o "+sourceCodeLocation+" -p generated";
            LOG.info("Executing {}", command);
            Process p = Runtime.getRuntime().exec(command);
            int exitCode = p.waitFor();
            if(exitCode != 0) {
                LOG.error("Error {}", p.getOutputStream());
            }
        } catch(IOException | InterruptedException ex) {
            ex.printStackTrace();
            throw new FormatException(ValidationMessages.FAILED_TO_DEPLOY_CONTRACT);
        }
    }

 private String invokeDeployment(String password, String walletFileName, String contractFileName) {
        try {
            Credentials credentials = WalletUtils.loadCredentials(password, walletLocation + "/" + walletFileName);
            Class classz = Class.forName("generated."+ StringUtils.capitalize(contractFileName));
            Method method = classz.getDeclaredMethod("deploy", Web3j.class, Credentials.class, BigInteger.class, BigInteger.class);

            RemoteCall<?> invoke = (RemoteCall<?>)method.invoke(classz, web3JClient.getClient(), credentials, DefaultGasProvider.GAS_PRICE, DefaultGasProvider.GAS_LIMIT);
            Contract contract = (Contract)invoke.send();
            return contract.getContractAddress();
        } catch (Exception e){
            e.printStackTrace();
            throw new FormatException(ValidationMessages.FAILED_TO_DEPLOY_CONTRACT);
        }
    }
TylerH
  • 20,799
  • 66
  • 75
  • 101
Minisha
  • 2,117
  • 2
  • 25
  • 56

1 Answers1

0

It was because, the class was not loaded in the class path. Compile and load the class to the class path resolved the issue.

Minisha
  • 2,117
  • 2
  • 25
  • 56