blog

JavassistProxyプロキシのダボソースコード解析 --- (XIV)

このソースコードは主にバージョン2.7.7-releaseに基づいています。 動的プロキシを作成し、ここでProxyは、プロキシ抽象クラスのDubbo実装であり、jdkのネイティブProxyではなく、...

Mar 14, 2020 · 5 min. read
シェア

このソースコードは、主にバージョン2.7.7-リリースに基づいています。プロキシ拡張ポイントのDubboはProxyFactoryインターフェイスですが、デフォルトのSPI拡張ポイントは、javassistは、Proxy#getProxyプログラムを介して、インターフェイスを渡すと、動的なプロキシを作成するnewInstanceを呼び出すことです、ここでProxyは、プロキシ抽象クラスDubboの実装ではなく、jdkの元のProxyではなく、この列InvokerInvocationHandlerまたはJDKネイティブInvocationHandlerインタフェースを実装しています。 ClassUtil#getClassLoaderでクラスローダを取得し、ワームのオーバーロードメソッドを呼び出し、クラスローダとプロキシインタフェースを渡します。プロキシを作成するロジックを追加し、1まず、インターフェイスの数が65535を超えることはできませんチェックし、キャッシュのキーとして、すべてのインターフェイス名をスプライスします。 これは、プロキシのキャッシュのデータ構造、つまり、MapのネストWeakHashMapデータ構造です。ここでは、キャッシュ操作に同期ロックを追加し、まず第一に、クラスローダによると、HashMapキャッシュを取得し、プロキシエージェントを取得するキーによると、キャッシュがすでに存在する場合は、直接キャッシュに戻るかどうかを決定するためではなく、値がPENDING_GENERATION_MARKER(すなわち、オブジェクトのブロッキングフラグです。)、もしそうなら、常にプロキシクラスの作成の完了を待つためにwaitを呼び出し、プロキシクラスカウンタに1を加えたものを作成し、Dubboの最初のバイトコード操作であるClassGeneratorクラスをインスタンス化し、非パブリックインターフェイスが別のパッケージからのものであるかどうかをチェックし、インターフェイスのメソッドを解決するためにトラバースされ、CodeGeneratorインスタンスに追加され欧创建默认生成ProxyInstance类名规则是包名+ ".proxy" + 自增id,生成Proxy的实例, 是Proxy.class.getName()+ id, 然后调用ClassGenerator生成的toClass底层是通过javasist生成字节码, 然后。メモリに記録されたクラスローダを通して

Dubboフレームワークは、生成されたバイトコードをファイル構成に出力してくれないので、バイトコードの生成に以下のコードを追加し、ファイルに書き込みました。

 String proxyName = "$Proxy" + id +".class";
 Path path = Paths.get(proxy
 Files.write(path, mCtc.toBytecode(), new OpenOption[0]);

次に、生成されたバイトコードのデコンパイルファイルを示します。

一つ目はプロキシのインスタンスのクラスです。

public class Proxy0 extends Proxy implements DC {
 public Object newInstance(InvocationHandler var1) {
 return new proxy0(var1);
 }
 public Proxy0() {
 }
}

2つ目はプロキシクラスです。

public class proxy0 implements DC, Destroyable, EchoService, DemoService {
 public static Method[] methods;
 private InvocationHandler handler;
 public Object invoke(String var1, String var2) throws Exception {
 Object[] var3 = new Object[]{var1, var2};
 Object var4 = this.handler.invoke(this, methods[0], var3);
 return (Object)var4;
 }
 public String get(CustomArgument var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[1], var2);
 return (String)var3;
 }
 public long timestamp() {
 Object[] var1 = new Object[0];
 Object var2 = this.handler.invoke(this, methods[2], var1);
 return var2 == null ? (long)0 : (Long)var2;
 }
 public int getSize(Object[] var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[3], var2);
 return var3 == null ? 0 : (Integer)var3;
 }
 public int getSize(String[] var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[4], var2);
 return var3 == null ? 0 : (Integer)var3;
 }
 public void $invoke(String var1, String var2) {
 Object[] var3 = new Object[]{var1, var2};
 this.handler.invoke(this, methods[5], var3);
 }
 public byte getbyte(byte var1) {
 Object[] var2 = new Object[]{new Byte(var1)};
 Object var3 = this.handler.invoke(this, methods[6], var2);
 return var3 == null ? (byte)0 : (Byte)var3;
 }
 public void sayHello(String var1) {
 Object[] var2 = new Object[]{var1};
 this.handler.invoke(this, methods[7], var2);
 }
 public String getThreadName() {
 Object[] var1 = new Object[0];
 Object var2 = this.handler.invoke(this, methods[8], var1);
 return (String)var2;
 }
 public int stringLength(String var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[9], var2);
 return var3 == null ? 0 : (Integer)var3;
 }
 public Type enumlength(Type[] var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[10], var2);
 return (Type)var3;
 }
 public Person getPerson(Person var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[11], var2);
 return (Person)var3;
 }
 public String testReturnType(String var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[12], var2);
 return (String)var3;
 }
 public List testReturnType1(String var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[13], var2);
 return (List)var3;
 }
 public CompletableFuture testReturnType2(String var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[14], var2);
 return (CompletableFuture)var3;
 }
 public CompletableFuture testReturnType3(String var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[15], var2);
 return (CompletableFuture)var3;
 }
 public CompletableFuture testReturnType4(String var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[16], var2);
 return (CompletableFuture)var3;
 }
 public CompletableFuture testReturnType5(String var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[17], var2);
 return (CompletableFuture)var3;
 }
 public String echo(String var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[18], var2);
 return (String)var3;
 }
 public Object $echo(Object var1) {
 Object[] var2 = new Object[]{var1};
 Object var3 = this.handler.invoke(this, methods[19], var2);
 return (Object)var3;
 }
 public void $destroy() {
 Object[] var1 = new Object[0];
 this.handler.invoke(this, methods[20], var1);
 }
 public proxy0() {
 }
 public proxy0(InvocationHandler var1) {
 this.handler = var1;
 }
}
Read next

flutterはiOSネイティブのリスト項目のスワイプ削除ライブラリを模倣する flutter_swipe_action_cell

iOSネイティブのエフェクトを提供するリストスライダーライブラリ Example1: 最も単純な例 - DeleteTip: ListViewの中に次のように記述し、returnを返します。

Mar 13, 2020 · 3 min read