2016-10-16 5 views
1

クラスを動的に作成します。バイトコードを構築し、クラスローダーで読み込むことによってクラスを動的に作成します。その後、私はこのクラスのInputStreamを取得する必要があります。一般的なクラスでは、私はこのクラスのリソースURLを取得し、ストリーム(url.openStream())を開いてこれを取得します。明らかに、ここで私はそれを行うことはできません。動的にロードされるクラスにURLがないためです。(バイトコードを使用して)動的に作成されたクラスのInputStreamを取得しますか?

動的に作成されたクラスのInputStreamはどうすれば入手できますか?

atmの唯一の解決策は、バイトコードを一時ファイル/メモリに保存してから、InputStreamを提供することです。

EDIT

私は、既存の上に別のバイトコードの変更を行うためにInputStreamを必要としています。

+0

バイトコードを 'byte []'として持っていれば、 'ByteArrayInputStream'を作ることができます。 –

+0

私はそれを持っていますが、それはアプリの別の場所と異なる時に生成されます。生成された各プロキシクラスに対して 'byte []'をすべて集めるようになると、あまりにも多くなります。とにかく、私はこのオプションを模索しています。 – igr

+0

あなたはInputStreamで何をする必要があるのか​​を明示していないので、私は推測することしかできませんが、ObjectInputStreamが役に立ちますか? ref:[ObjectInputStreamのjavadoc](https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html) – mangotang

答えて

1

クラスローダが(これは合法である、クラスローダ契約がそのようなことを指定していない)getResourcegetResourceAsStreamのいずれかを介して、クラスのバイトコードを提供していない場合、あなたはまだuのバイトを作成するためにVMを尋ねるためse a Java agentすることができますあなたのためのコード。

たとえば、次のトランス登録することができますJavaエージェントを取り付けた後

instrumentation.addTransformer(new ClassFileTransformer() { 
    @Override 
    public byte[] transform(ClassLoader loader, 
          String name, 
          Class<?> classBeingRedefined, 
          ProtectionDomain pd, 
          byte[] classFileBuffer) { 
    doSomethingWith(classFileBuffer); 
    return null; 
    } 
}, true); 

を、あなたが呼び出すことができます。instrumentation.retransform(someGeneratedClass)をしても生成されたタイプのクラスファイルが含まれます上記のクラスファイルの変圧器をトリガすることクラスローダーからは使用できません。

+0

Heya Rafael!答えのためのThanx;エージェントだけがオプションとして常に利用可能なわけではありません。私は別の方法で私の問題を解決しましたが、まだ、私はいくつかの一時ファイルで生成されたバイトコードを収集するかもしれません(それらが使用時に毎回作成されない限り) – igr

関連する問題