2016-08-29 5 views
0

からjarファイルからクラスファイルを読み込むことが可能ですので、私は、Javaにかなり新しいですが、私が達成しようとしていることは、私は特定のディレクトリにあると私はなりたいjarファイルを含むリストを持っていますそれらのjarファイル内のクラスファイルを読み込み、クラスファイル内にある文字列をグローバルに検索することができます。は、それが特定のパス

私の現在のコード:

Class<?> clazz; //get the class you need 
Field f = clazz.getField("Variable_name"); 
// if Field f is null, no field exist with the given name 

// this is necessary if the field is not public. 
f.setAccessible(flag); 

// if the field is not static, the parameter is the instance you want the field from 
// otherwise it can be null 
Object variableValue = f.get(null); // or f.get(clazzInstance); 

この特別なクラスローディングやクラスファイルリーダーを必要としない:あなたが特定の名前の変数を求めている場合は

public class Dank 
{ 

    public static void main(String[] args) 
    { 
     List<File> jarFiles = new ArrayList<>(); 
     File[] mods = new File(System.getProperty("user.home") + "\\AppData\\Roaming\\.minecraft\\mods").listFiles(); 


     for(File file : mods) 
     { 
      if(file.isFile()) 
      { 
       String filename = file.getName(); 
       if(filename.endsWith(".jar")) { 
        jarFiles.add(file); 
       // System.out.println(filename); 
       } 
      } 
     } 

    } 
} 
+0

なぜ、McForge自身がmod(クラス)を取得する方法を提供しているのですか?あなたは何を探しているのですか?特定のクラス、またはクラスファイル内のデータ?後でもっとたくさんのものがあるから – n247s

+0

すべてのクラスファイルで文字列を検索できるようにしたい場合、その文字列が存在すると特定のイベントが発生した場合 –

+0

'class'ファイル形式の指定があります。 'class'ファイルのセクションの1つに、それで使用されるすべての文字列が含まれています。 – talex

答えて

0

次を使用することができます/パーサー。それだけでなく、あまりにも多くのパフォーマンスを損なうことなく、いつでも実行できます。免責事項として

けれども、これは直接フィールドを直接refferingよりも時間がかかります。特にMcForgeへのアクセス権があるので、Optionalという異なるサブクラスを使用することもできます。これは、この問題のさらに優れた解決策です。それはまともに文書化されているので、把握することはそれほど難しいとは思わない。

これはあなたが正しい方向を指していることを願っています。この記事は実際にはForgeForumsに属していますが、McForgeのシステムで簡単に解決できます。

+1

'特別なクラスローディングを必要としません。 'のような文は慎重に扱うべきです。 jarファイルがアプリケーションの起動時にクラスパスに見つからない場合(およびOPが指し示すディレクトリが確実に存在しない場合)、jarファイル内でクラスオブジェクトを取得する方法が必要です。カスタムのクラスローディングがなければ、これは達成するのが難しいかもしれません。また、クラスファイルをアプリケーション内でさらに必要としない場合は、メモリ内に保管することは無駄かもしれません。ただし、アプリクラスローダーでクラスをアンロードすることはまだできません。 –

+0

私はそれがアプリケーションのケースかもしれないことを理解しています。しかし、Minecraft modding環境を知っているので、自分のmodで任意の(イベント)メソッドが呼び出される前に、すべてがプリロードされている(そして再起動している)ので、私はそのようなコメントを述べることにします。個人的な経験から、事前ロード、ASM、再起動のために、その環境内でclassLoaderを実際に使用するのは実際には難しいことが分かります。余分に私は、この問題はMcForgeの実装の助けを借りて問題を解決することができるので、実際問題とは言えないので、ForgeForums – n247s

関連する問題