• ベストアンサー

Class.forNameって?

Class t = Class.forName("java.lang.Thread"); と Thread t=new Thread(); の 違いを教えてください。

  • keyguy
  • お礼率68% (895/1314)
  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.3

いきなりで申し訳ないですが、まず訂正です。 Thread t = Class.forName("java.lang.Thread").newInstance(); ではなくて Thread t = (Thread) Class.forName("java.lang.Thread").newInstance(); でした。失礼いたしました。 さて前の回答の補足についてですが、実際には、単純にクラスをインスタンス化するのに、いちいち Thread t = (Thread) Class.forName("java.lang.Thread").newInstance(); というような長い命令を書かなくても、 Thread t = new Thread(); と書くだけで十分です。 ただ、上の newInstance() を使う方法が完全に無意味であるかというと、そうでもないのです。 new Thread() と書くと、インスタンス化されるクラスはコンパイルの時点で Thread に固定されてしまいますが、場合によっては、どのクラスをインスタンスかするのか実際にプログラムを動かしてみるまでわからないということもあります。 こういう場合、例えば Object obj; if ("java.lang.Object".equals(className)) { obj = new Object(); } else if ("java.lang.Thread".equals(className)) { obj = new Thread(); } else if ("java.lang.String".equals(className)) { obj = new String(); } というようにいちいち書き分けるよりも、 Object obj = Class.forName(className).newInstance(); と書いたほうが分かりやすく、かつ柔軟に対応できるのです。こういう場面では、newInstance() が活躍します。

その他の回答 (2)

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

ややこしいようですが、実は全く違います。 Class t = Class.forName("java.lang.Thread"); は、Threadクラスに対応するClassクラスのインスタンスを取得しています。 Classクラスは、「クラスを表すクラス」です。 この場合では、Threadクラスを表す、Classクラスのインスタンスを取得しています。ここでは、Threadクラスのインスタンスは登場しません。 Thread t=new Thread(); は、実際にThreadクラスのインスタンスを作成しています。ここでは、Classクラスは登場しません。 さらにややこしい話をして申し訳ないですが、Threadクラスを表すClassクラスのインスタンスから、実際のThreadクラスのインスタンスを作ることもできます。つまり、 Thread t = Class.forName("java.lang.Thread").newInstance(); と Thread t = new Thread(); は同じ結果になります。

keyguy
質問者

補足

ありがとうございます。 Thread t = Class.forName("Thread").newInstance(); をときどきみるのですが敢えて Thread t = new Thread(); と書かないのは何か意図があるのでしょうか? いっぱい書かなければならないのでメリットが無いと不合理だと思うのですが。

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

>Class t = Class.forName("java.lang.Thread"); tはThreadというクラスそのもの コンストラクタは呼ばれていない メンバ等はまだ実態が存在しない >Thread t=new Thread(); tはインスタンス化されたThreadクラスのオブジェクト コンストラクタが呼ばれている

keyguy
質問者

お礼

ありがとうございます。

関連するQ&A

  • Object.class

    Object.classをWindowsXPの検索機能で調べると  java/langというホルダーが表示されますが 普通のC:\java\・・・表現ではないので戸惑っています。java/langは何処にあるのですか。

    • ベストアンサー
    • Java
  • eclipse java oracle 接続について

    同じような質問があり、試してみたのですができませんでした 初心者なので、勉強不足だとは思っていますがどうかヨロシクお願いします Exception in thread "main" java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at Oracletest.main(Oracletest.java:11) というエラーがでています オラクルのドライバが探せていないのはわかるのですがPATHも通しているので手詰まりになってしまいました ちなみに オラクル 10g java 1.5.0_09 を使っています 詳しい設定方法を教えて下さると助かります よろしくお願いします

  • Oracle8i に接続しようと思うんですが、エラーが出ます。

    Oracle 8i に接続したいと思い、 C:\Oracle\Ora81\jdbc\lib に classes12.zip を置いています。 クラスパスの設定は、C:\Oracle\Ora81\jdbc\lib\classes12.zip としています。classes12 は oracle 9i 用を使っています。 ちなみに、OSはWin2000professional です。 // JDBC ドライバの登録 DriverManager.registerDriver( new oracle.jdbc.driver.OracleDriver() ); とすると、 Exception in thread "main" java.lang.NoClassDefFoundError: oracle/jdbc/driver/Or acleDriver at DbTest.main(DbTest.java:16) のエラーが出て、 Class.forName("oracle.jdbc.driver.OracleDriver");  とすると、 java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at DbTest.main(DbTest.java:19) というエラーが出ます。 誰かわかる人がいたら、教えてください.よろしくお願いします。

    • ベストアンサー
    • Java
  • 明示的にコンパイル

    java eclipse3.5を使ってプログラミングの勉強をしています。 あるプログラムを実行するために、事前にいくつかのプログラムを 明示的にコンパイルしなくてはいけないのですが、明示的にコンパイルする方法が分かりません。 あるサイトを見たら、【プロジェクト】ー>【すべて再ビルド】を 選択すればよいとかかれていたのでやってみたのですが、次のような エラーが出てしまいます。 Exception in thread "main" java.lang.ClassNotFoundException: EchoProtocolFactory at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at socket_110.ThreadMain.main(ThreadMain.java:22) このエラーを取り除くには、どうすればよいのでしょうか? 分かる方お願いします。

  • リフレクション

    リフレクションによって、Stringの値(strVal)を各クラスのオブジェクトに変換したいと思っております。 下のようなコードで、this.typeにセットしてあるオブジェクトのvalueOfメソッドを実行したいのですが、clazz.getMethod部分で次のようなExceptionが発生してしまいます。 staticメソッドはgetMethodでは取得・実行できないのでしょうか? ご存知の方いらっしゃいましたら、教えて頂けないでしょうか。 【Exception】 java.lang.NoSuchMethodException: java.lang.String.valueOf() 【コード】 Class clazz = Class.forName(this.type); Method method = clazz.getMethod("valueOf", new Class[0]); return method.invoke(clazz.newInstance(), new Object[]{strVal} ); 今回、this.typeには、"java.lang.String"が入っています。

    • ベストアンサー
    • Java
  • Lunux で Java をするには?

    CLASSPATH=.:/root/workspace/test:export CLASSPATH と環境設定し /root/workspace/test/test に Test0.java: package test; class SayHello { public void method() { System.out.println("Hello World!"); } } と SayHello.java: package test; public class Test0 { public static void main(String[] args) { SayHello sh=new SayHello(); sh.method(); } } を作り javac Test0.java SayHello.java をし(成功) java Test0 をしたのですが [root@Prime test]# java Test0 Exception in thread "main" java.lang.NoClassDefFoundError: loaded class Test0 was in fact named test.Test0 at java.lang.VMClassLoader.defineClass(libgcj.so.7) at java.lang.ClassLoader.defineClass(libgcj.so.7) at java.security.SecureClassLoader.defineClass(libgcj.so.7) at java.net.URLClassLoader.findClass(libgcj.so.7) at java.lang.ClassLoader.loadClass(libgcj.so.7) at java.lang.ClassLoader.loadClass(libgcj.so.7) at java.lang.Class.forName(libgcj.so.7) at gnu.java.lang.MainThread.run(libgcj.so.7) [root@Prime test]# となりうまくいかないのですが対策を教えてください。

    • ベストアンサー
    • Java
  • Servlet上でのClass#forName()について

    こんにちは。三田と申します。 Class#forName()で取得したClassオブジェクトが、Servlet上とそうでない場合で結果が違っていました。 実際、行っている処理は、あるクラスのClassオブジェクトをClass#forName()で取得して、次にそのクラスのインスタンスを生成して、Class#isInstance()をしているだけです。 上記の処理を行った場合に、Servlet上ではfalseで そうでない場合は、trueになるのです。 デバックしてみたところ、インスタンスを生成したときにServlet上では、Classオブジェクトの変数に値が入っていないのに対し、Servletを使用しない場合は、Classオブジェクトの変数に値が入っていました。 その違いは発見したのですが、なぜそうなるのかがわかりません。理由を知っている方がいらっしゃいましたら、ぜひご教授をお願いします。 以上、よろしくお願いします。

  • Class.forNameでエラーになる

    eclipseでjavaのSQL接続を書こうとしているんですが クラスが無いというエラーが出てしまいます。 Class.forNameの所で「処理されない例外の型 ClassNotFoundException」と出ます。 その次の行もエラーになってて、とりあえずClass.forNameだけでもエラー無くそうと思い調べました。 ぐぐったらクラスパス?が悪いとなると書いてあったので eclipseで「プロジェクトを右クリック→プロパティー→Java Build Path→ライブラリタブ」から 「外部jarの追加」で「C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib」に入ってる 「ojdbc5.jar」と「ojdbc6.jar」と「ojdbc6_g.jar」を追加しました。(どれが対象かわからなかったので全部追加) この状態でも同じエラーが出てしまいます。クラスパスの指定の方法が悪いんでしょうか? 入れてるoracleは「Oracle Database Express Edition 11g Release 2」です。 OSは「Windows Vista」になります。接続はローカル接続です。 以下コードです。最初の方の<HTML>らへんは無視して下さい。 import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println("<BODY>"); out.println(new java.util.Date()); out.println("</BODY>"); out.println("</HTML>"); Class.forName ("oracle.jdbc.driver.OracleDriver"); Connection connection=DriverManager.getConnection("jdbc:oracle:oci8:@","system","pass"); } }

  • コンパイルエラー(Threadオブジェクト化)

    Runnableを継承したNormalClassをThreadとしてオブジェクト化しようとしているのですが、コンパイルエラーが出現して困っています。どうすればいいでしょうか? 下記エラー参照 Main.java:1: NormalClass は abstract でなく、java.lang.Runnable 内の abstract メソッド run() をオーバーライドしません。 下記ソース class NormalClass implements Runnable{ } class Main extends Thread{ public static void main(String args[]){ test = new Thread(new NormalClass()); } }

    • ベストアンサー
    • Java
  • java classの呼び出し方を教えて下さい。

    java classの呼び出し方を教えて下さい。 public class test extends Applet implements Runnable,ActionListener,KeyListener{ Thread th; // スレッド宣言 AudioClip IdoSound,KaitenSound,KesiSound,SetSound,CrySound; public void init(){ }   ・   ・   ・ public void test(){ ここで、最下欄の class stream{ public static void main(String args[]){ } を実行させたいのですが、記入方法が解りません・・・ } public int kesiOne(int VP,int HP){ }    ・    ・    ・ class stream{ public static void main(String args[]){ try{ File file = new File("c:\\java\\data.txt"); if (checkBeforeWritefile(file)){ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); pw.println("12345"); pw.close(); }else{ System.out.println("ファイルに書き込めません"); } }catch(IOException e){ System.out.println(e); } } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } } 解りにくい書き方で申し訳け有りませんが、宜しくお願いします。

専門家に質問してみよう