継承したクラスのクラス名の取得方法
- C#3.5を使用している場合、継承したクラスのクラス名を取得する際には、BaseClassで定義されているメソッドを使用します。
- BaseClassのStackTraceを使ってクラス名を取得できるメソッドを持っています。
- DerivedClass側でBaseClassのメソッドを使用してクラス名を取得することができます。
- ベストアンサー
継承したクラス側のクラス名の取得
C#3.5を使用しています。 BaseClassはStackTraceを使ってクラス名を取得できるメソッドを持っています。 それを継承したDerivedClass側でそのクラス名「DerivedClass」を取得したいのですが、 次のようなやり方では「BaseClass」が取得されてしまいます・・・ あくまでBaseClass側に記述したメソッドのままで、DerivedClass側のクラス名を取得するには どのようにしたら良いのでしょうか? public class BaseClass { public string className; public string ClassName { get { if (className == null) { StackTrace st = new StackTrace(false); StackFrame sf = st.GetFrame(0); className = sf.GetMethod().ReflectedType.Name; } return className; } set { className = value; } } } public class DerivedClass : BaseClass { } var c = new DerivedClass(); MessageBox.Show(c.ClassName);// BaseClassと表示される
- takagoo100
- お礼率85% (739/868)
- その他(プログラミング・開発)
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんなのどうですか? class Program { public class BaseClass { } public class DerivedClass : BaseClass { } static void Main(string[] args) { var c = new DerivedClass(); Console.WriteLine(c.GetType().Name); } }
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
ん~, 見た感じだと DerivedClass のコンストラクタで ClassName を設定する ことができるような気がするんだけど....
お礼
ご返答ありがとうございます。 なるべくDerivedClass側には記述せずにクラス名を取得したいと思ってます。
関連するQ&A
- 呼び元のファイル名、行数を取得したい
Visual Basic 2005で開発を行っています。 今回ログクラスを作成するに当たり、ログを出力する命令が発行された際に、 その呼び元であるクラス名、メソッド名、できればファイル名やその行数 を取得したいと思っています。 ネットで調べてみましたが、 New StackTrace().GetFrame(1).GetMethod().DeclaringType.ToString() New StackTrace().GetFrame(1).GetMethod().Name のようにして呼び元のクラス名、メソッド名の取得は出来たのですが、 ファイル名、行数などの取得が出来ません。 log4netを調べてみようかと思いましたが、ちゃちゃっと解析できるわけもなく・・・。 調べていたらデバッグシンボルを設定してあげると New StackTrace().GetFrame(1).GetFileName などが使えるようなのですが、そのデバッグシンボルの 設定の仕方が分かりません・・・。 どなたかファイル名、行数を取得する方法をご教示下さい。 また、それでデバッグシンボルというものの設定が必要であれば その設定方法もお願い致します。
- ベストアンサー
- Visual Basic
- リフレクション 可変長引数メソッドの取得
リフレクションで、(1)の方のメソッドインスタンスを得たいとき、どういった方法が考えられますか? //JDK 6.0 public Hoge { void method1(String str, Object ...objs){}//(1) void method1(String str, String str2){}//(2) } Hoge hoge = new Hoge(); Class c = hoge.getClass(); Method m12 = c.getMethod("method", String.class, String.class); Method m11 = c.getMethod("method", ?? );
- ベストアンサー
- Java
- インスタンス内から自分のクラス名を取得する方法
クラスインスタンス内から自分のクラス名を取得しようと思うと、self.class.nameで取得できますが、type.nameでも取得できます。 しかし、typeは非推奨メソッドとなっているため、警告が出て、このままでは使用することができません。 素直にself.classを使えばいいのかもしれませんが、selfのワンクッションがどうにも気に入りません。 スマートな記述方法あったら教えて下さい。 # self.class.nameを使用する場合 class MyClass def print_classname puts self.class.name # puts class.name これはエラー end end # type.nameを使用する場合 class MyClass2 def print_classname puts type.name # これはdeprecatedの記述で警告が出る end end
- 締切済み
- Ruby
- リフレクション
リフレクションによって、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
- 全パッケージの取得、全クラスの取得、全メソッドの取得
やりたい事は、メインクラスより、同階層の全パッケージを取得(A)、 (A)より同階層の全クラスを取得(B)、 (B)より同階層の全メソッドを取得といったような事です。 例えば public class a { public static void main(String args[]) { 全パッケージの取得 全クラスの取得 全メソッドの取得 } } みたいな感じに。 試行錯誤したのですが、その処理を行う事の出来るメソッドかどうかも良く分からないし、 コンパイルエラーになるばかりで実現が出来ません。 ・メインクラスから同階層のパッケージを取得してパッケージ名を出力。 ・メインクラスからxパッケージ内の同階層のクラスを取得してクラス名を出力。 ・メインクラスからxパッケージにあるyクラス内のメソッドを取得してメソッド名を出力。 上記のようなめちゃくちゃシンプルなコードを挙げてご教示願います。
- ベストアンサー
- Java
- 配列クラスのクラス名
配列クラスのクラス名 配列クラスのクラス名を教えてください。 配列はクラスですよね。そこまでは分かります。 こんなコードを実行しましたが System.out.println((new int[0]).getClass()); System.out.println((new boolean[0]).getClass()); System.out.println((new String[0]).getClass()); System.out.println((new Integer[0]).getClass()); 親切にこのような結果を出力してくれます。 class [I class [Z class [Ljava.lang.String; class [Ljava.lang.Integer; 結果として配列が何というクラスなのかは分かりません。 (もしかして『[I』『[Z』『[L』という名前のクラスでしょうか?) 昔Javaのソースを読んだときに、配列クラスのファイルも 読んだことがあるような気がするのですが、 なんと言うクラスだったか忘れてしまいました。 パッケージ名+クラス名を教えてください。 よろしくお願いします。
- ベストアンサー
- Java
- クラスの中のクラスへのアクセス
お世話になります。 クラスが以下のようにあります。 class ClassName1{ var $classname2_obj; // クラス「ClassName2」のオブジェクト function getClassName2Obj(){ return $this->$classname2_obj; } } class ClassName2{ var $array_list; // 配列です function getArrayList(){ return $this->array_list; } } やりたいのは、ClassName1のgetClassName2Obj関数でClassName2の配列をgetArrayListで取得したいのです。 $a = new ClassName1; $b = $a->getClassName2Obj(); $c = $b->etArrayList(); 上の$b = … と$c = …の部分の処理を一行にまとめることはできないでしょうか? 何卒よろしくお願い致します。 PHPは5です。
- ベストアンサー
- PHP
- PHPのクラス継承において質問
class SuperClass{ public function getSuperClassName (){ //操作中のオブジェクトのクラス名を取得する print get_class($this); print "<br />"; print __CLASS__; } } class SubClass extends SuperClass{ public function getSubClassName (){ //操作中のオブジェクトのクラス名を取得する print get_class($this); print "<br />"; print __CLASS__; } $obj = new SubClass(); print "<br />"; $obj -> getSuperClassName(); print "<br />"; $obj -> getSubClassName(); 上記のようなコードがあった場合、 出力結果は SubClass SuperClass //継承しているにもかかわらず、SuperClassという文字列が返る。 SubClass SubClass と上記のようになります この結果に一点疑問があるのですが、親クラスのメソッドは子クラスに継承されるんですよね? であれば親クラスの public function getSuperClassName (){ //操作中のオブジェクトのクラス名を取得する print get_class($this); print "<br />"; print __CLASS__; } の箇所の print __CLASS__; の記述箇所はSubClassとでなければいけないような気がします。 しかし結果はSuperClassとでますが、このメソッドは子クラスに継承されていないのですか? publicなら継承されるとマニュアルにかいてありましたが、どうなっているのでしょうか よろしくご教授御願い致します。
- ベストアンサー
- PHP
- 外部jarの標準出力を取得できますか?
ClassLoaderで外部jarのクラスをロードし、実行するプログラムを作りました。 SimpleOutputは、単に渡された引数を標準出力に出すだけのものです。 この値を取得してGUI上に表示させたいのですが、取得する方法をご教授ください。 System.out.println("Load class"); URL[] urls = { file.toURI().toURL() }; ClassLoader loader = URLClassLoader.newInstance(urls); Class<?> cls = loader.loadClass("SimpleOutput"); System.out.println(cls); Object obj = cls.newInstance(); Method method = cls.getMethod("main", String[].class); String[] av = {"test"}; method.invoke(obj, new Object[]{av});
- ベストアンサー
- Java
お礼
ご返答ありがとうございます。 なるほど、別にStackTraceを使わなくても そのやり方で取得できたんですね・・・