Open7
Classクラスで遊ぶ
基本
getClass()
インスタンスからClassクラスのオブジェクトの取得 // 適当にオブジェクトを作成
Object o = new Object();
Class<Object> co = o.getClass()
// ==> class java.lang.Object
クラス名.class
)によるClassクラスのオブジェクトの取得
クラスリテラル(Class<Object> co = Object.class
// ==> class java.lang.Class
ClassクラスインスタンスもClass<Class>のオブジェクトを持っている
Class<Class> cc = Class.class
// ==> class java.lang.Class
HashSetの持つすべてのメソッド名を取得する。
for
import java.lang.reflect.Method;
import java.util.HashSet;
public class HashSetMethods {
public static void main(String[] args) {
HashSet<Integer> set = new HashSet<>();
Method[] methods = set.getClass().getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
}
}
-
stream
経由
Arrays.stream(HashSet.class.getMethods())
.forEach(m -> System.out.println(m.getName()))
int[] のクラスの持つすべてのメソッド名を取得する。
- for
Method[] methods = int[].class.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
int[]のクラスの取得 その1
int[].class
// ==> class [I
int[]のクラスの取得 その2
Class.forName("[I")
// ==> class [I
配列のクラス名
基本データ型の配列のクラス名は
-
int[]
=>[I
-
double[]
=>[D
-
boolean[]
=>[Z
-
char[]
=>[C
-
long[]
=>[J
-
float[]
=>[F
-
short[]
=>[S
-
byte[]
=>[B
となる。
参照型の配列のクラス名は
-
Object[]
=>[Ljava.lang.Object;
-
Integer[]
=>[Ljava.lang.Integer;
のように[L<classname>;
の形になる。
<classname>はFQCNであることと、最後にセミコロンがつく点に注意。
クラス名.class
)での取得
クラスリテラル(int[].class
// ==> class [I
Object[].class
// ==> class [Ljava.lang.Object;
Integer[].class
// ==> class [Ljava.lang.Integer;
Class.forNameでの取得
Class.forName("[I")
// class [I
Class.forName("[Ljava.lang.Object;")
// ==> class [Ljava.lang.Object;
Class.forName("[Ljava.lang.Integer;")
// ==> class [Ljava.lang.Integer;
Classクラスの持つメソッドについて
Class.class.getMethods()
でClassクラスの持つメソッドが取得できる。
以下はjshellでの実行結果
Method[78] { public static java.lang.Class java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader) throws java.lang.ClassNotFoundException, public static java.lang.Class java.lang.Class.forName(java.lang.Module,java.lang.String), public static java.lang.Class java.lang.Class.forName(java.lang.String) throws java.lang.ClassNotFoundException, public java.lang.String java.lang.Class.toString(), public java.lang.Module java.lang.Class.getModule(), public java.security.ProtectionDomain java.lang.Class.getProtectionDomain(), public native boolean java.lang.Class.isAssignableFrom(java.lang.Class), public native boolean java.lang.Class.isInstance ... ng.Object.wait() throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Object), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll() }
ちょっと見づらいので、整形
Arrays.stream(Class.class.getMethods()).forEach(m -> System.out.println(m.getName()))
実行結果
- forName
- forName
- forName
- toString
- getModule
- getProtectionDomain
- isAssignableFrom
- isInstance
- getModifiers
- isInterface
- isArray
- isPrimitive
- getSuperclass
- cast
- getName
- toGenericString
- newInstance
- isAnnotation
- isSynthetic
- getClassLoader
- getTypeParameters
- getGenericSuperclass
- getPackage
- getPackageName
- getInterfaces
- getGenericInterfaces
- getComponentType
- getSigners
- getEnclosingMethod
- getEnclosingConstructor
- getDeclaringClass
- getEnclosingClass
- getSimpleName
- getTypeName
- getCanonicalName
- isAnonymousClass
- isLocalClass
- isMemberClass
- getClasses
- getFields
- getMethods
- getConstructors
- getField
- getMethod
- getConstructor
- getDeclaredClasses
- getDeclaredFields
- getDeclaredMethods
- getDeclaredConstructors
- getDeclaredField
- getDeclaredMethod
- getDeclaredConstructor
- getResourceAsStream
- getResource
- desiredAssertionStatus
- isEnum
- getEnumConstants
- asSubclass
- getAnnotation
- isAnnotationPresent
- getAnnotationsByType
- getAnnotations
- getDeclaredAnnotation
- getDeclaredAnnotationsByType
- getDeclaredAnnotations
- getAnnotatedSuperclass
- getAnnotatedInterfaces
- getNestHost
- isNestmateOf
- getNestMembers
- wait
- wait
- wait
- equals
- hashCode
- getClass
- notify
- notifyAll
forNameやwaitなど、実装がオーバーロードされているものがある。
Java11 の公式ドキュメントを見ると
-
forName(Module module, String name)
与えられたモジュール内の与えられた「バイナリ名」を持つClassを返します。 -
forName(String className)
指定された文字列名を持つクラスまたはインタフェースに関連付けられた、Classオブジェクトを返します。 -
forName(String name, boolean initialize, ClassLoader loader)
指定されたクラス・ローダーを使って、指定された文字列名を持つクラスまたはインタフェースに関連付けられたClassオブジェクトを返します。
普通にClass.forName("[I")などとする場合は、2番のメソッドが呼ばれているぽい。
getInterfaces()
でInterFaceを取得。
-
HashSet
のInterface
HashSet.class.getInterfaces()
// => Class[3] { interface java.util.Set, interface java.lang.Cloneable, interface java.io.Serializable }
-
ArrayList
のInterFace
ArrayList.class.getInterfaces()
// => Class[4] { interface java.util.List, interface java.util.RandomAccess, interface java.lang.Cloneable, interface java.io.Serializable }