質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2635閲覧

クラスローダーでロードしたクラスに呼び出し元のシングルトンクラスを渡したい

mugichon

総合スコア61

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/06/09 13:21

現在クラスローダーを使用し、クラスから別jarをロードし、実行しようと考えています。

クラスロードされたメソッドに大量のパラメータを渡したいため、呼び出し元クラスでシングルトンを作成し、
呼び出されるJAR内で取得、使用して結果を返すように実装したいと考えています。

lang

1シングルトン 2public class Singleton { 3 private static Singleton singleton= new Singleton(); 4 private static String TMP; 5 public static Singleton getInstance(){ 6 return singleton; 7 } 8 public static String getTmp(){ 9 return TMP; 10 } 11 public static void setTmp(String s){ 12 TMP=s; 13 } 14} 15呼び出し元 16 Singleton sin; 17 sin.getInstance(); 18 sin.setTmp("AAAA"); 19 File file = new File("ss.jar"); 20 URLClassLoader loader = URLClassLoader.newInstance(new URL[]{file.toURI().toURL()}); 21 Class<?> clazz = loader.loadClass("ss"); 22 method = clazz.getMethod("Run"); 23 Object obj = clazz.newInstance(); 24 method.invoke(obj); 25 26呼び出し側 27 public class ss(){ 28 Singleton singleton; 29 singleton.getInstance(); 30 System.out.println(singleton.getTmp()); 31 } 32結果 33null 34

シングルトンは複数インスタンスを作成出来ないはずだと思いますが、
なぜクラスロードされた側ではシングルトンの値を取得できないのでしょうか?
また、取得する方法もあわせてご教示頂ければうれしいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そもそも添付されたソースが一見して静的コンパイルすら通らないと思われるので何とも言い難いのですが...。
結論だけいえばクラスローダが異なればstatic変数の格納場所も異なるから、という話だと思いますが...。
※参考キーワードで探せばたくさんでで来ると思いますが、例えば
http://kagamihoge.hatenablog.com/entry/2016/01/14/145457
原文では
「By using separate ClassLoader you can also loads same class from multiple sources and they will be treated as different class in JVM. 」
で、若干脇道なんですが、上記SingletonクラスはSingletonになっていません。GoFのシングルトンパンターンだけがSingletonじゃないが、これでは"TMP"というstatic変数を格納したただの器です。
例えば

Java

1public class Singleton { 2 private static final Singleton singleton= new Singleton(); 3 private String TMP;//<-staticでない 4 public static Singleton getInstance(){ 5 return singleton; 6 } 7 public String getTmp(){ 8 return TMP; 9 } 10 public void setTmp(String s){ 11 TMP=s; 12 } 13}

staticに管理されるのはメンバでなくて、「ただ一つのインスタンスが指し示す先」の方です。
※直接staticにするのと何が違うのかという質問も良く受けますが、拡張性が違う。

投稿2017/06/12 05:42

kurokoba

総合スコア276

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mugichon

2017/06/13 12:47

ソースコードは覚えている限り写したので正確性がなかったかもしれません。。 クラスローダーで呼び出した先にでは同一シングルトンを見ることはできないんですね。。 残念ですが他に方法を考えて見ます。 ご回答頂きありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問