2017-10-30 6 views
0

私はbytebuddy-agentを使ってJedisクラスの動的フィールドを追加し、JedisClusterコンストラクタでJedisクラスをJVMにロードする3つのJedisインスタンスを作成します。私が混乱させるのは コードJedisCluster cluster = new JedisCluster(nodes)の前にコードJedis jedis = new Jedis("localhost", 6379)を置くと、bytebuddy-agentはJedisクラスにダイナミックフィールドを追加します。新しいフィールドをロードするクラスを定義することができます

私は JedisCluster cluster = new JedisCluster(nodes)Jedis jedis = new Jedis("localhost", 6379)を置く場合
@Test 
public void testOnConstruct() throws Exception { 
    Jedis jedis = new Jedis("localhost", 6379); 
    Set<HostAndPort> nodes = new HashSet<>(3); 
    nodes.add(new HostAndPort("192.168.146.128", 7001)); 
    nodes.add(new HostAndPort("192.168.146.128", 7002)); 
    nodes.add(new HostAndPort("192.168.146.128", 7003)); 
    JedisCluster cluster = new JedisCluster(nodes); 
} 

、bytebuddyエージェントが正常にJedisクラスに動的にフィールドを追加することはできません。

私はあなたに助けていただきありがとうございます。

答えて

0

既にロードされているクラスにフィールドを追加することはできません.JVMはこれを禁止します。これを行うには、最初にロードする前にフィールドを追加する必要があります。

+0

すでにロードされているクラスにフィールドを追加するのは問題ではありません.JedisとJedisClusterをインスタンス化する順序です.JedisCのインスタンス化前にJedisのインスタンス化が行われると、Jedisのインスタンス化JedisClusterのintentiationの後、テストコードは失敗します。 – MengZhi

+0

JedisCluster triggのインスタンス化はJedisのロードです。 bytebuddy-agentは、インスタンス化でロードしている別のクラスtrigerがあるクラスに動的フィールドを追加できますか? – MengZhi

+0

https://github.com/raphw/byte-buddy/issues/368 – MengZhi

関連する問題