このソースコードは、主にバージョン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;
}
}