1. solidity的合约中,设定函数为view类型,如
function getAgent(address _agentAddress) public view returns(address _parentAddress, address _grandpaAddress){
require(agents[_agentAddress].isUsed, "address_none");
return (agents[_agentAddress].parentAddress, agents[_agentAddress].grandpaAddress);
}
这样通过web3j生成的java函数为
public RemoteCall<Tuple2<Address, Address>> getAgent(Address _agentAddress) {
final Function function = new Function("getAgent",
Arrays.<Type>asList(_agentAddress),
Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Address>() {}));
return new RemoteCall<Tuple2<Address, Address>>(
new Callable<Tuple2<Address, Address>>() {
@Override
public Tuple2<Address, Address> call() throws Exception {
List<Type> results = executeCallMultipleValueReturn(function);
return new Tuple2<Address, Address>(
(Address) results.get(0),
(Address) results.get(1));
}
});
}
接着,使用的话如下:
RemoteCall<Tuple2<Address, Address>> tuple2RemoteCall = MainContractController.mainContract.getAgent(_agentAddress);
Tuple2<Address, Address> addressAddressTuple2 = tuple2RemoteCall.send();
2. 如果函数不能是View类型,则solidity中只能通过emit事件了。
emit eventName(…)