Javaでの反射を学ぶ(一)
説明:コードはネット上のコードを参考にして、自分の分析と結びつけて勉強します.この文章の内容は後続で相応の修正が行われる
package com.reflect;
package com.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
/**
*/
interface GenericInterface {
};
class GenericSuperClass {
};
interface IClassTestA<A, B> extends GenericInterface {
String printA(A a);
}
interface IClassTestB<A, B> extends GenericInterface {
String printB(B b);
}
interface IClassTestC extends GenericInterface {
String printC();
}
class ClassTestC<A, B> extends GenericSuperClass implements IClassTestA<A, B> {
@Override
public String printA(A a) {
System.out.println("this is A:" + a);
return null;
}
}
public class ClassTest<A, B> extends ClassTestC<A, B> implements
IClassTestB<A, B>, IClassTestC {
private A a;
private B b;
private String c;
private ClassTest() {
}
public ClassTest(A a, B b) {
this.a = a;
this.b = b;
System.out.println("constructor :" + a.toString() + b.toString());
}
@Override
public String printB(B b) {
System.out.println("this is B:" + b);
return null;
}
@SuppressWarnings("unchecked")
public static void main(String[] args) {
try {
Class<ClassTest> classTest = ClassTest.class;
/** */
Class[] intf = classTest.getInterfaces();
System.out.print(" :");
for (Class c : intf) {
System.out.print(c.toString() + " ");
}
System.out
.println("
------------------------------------------------------------------------");
/**
* Type[] getGenericInterfaces public Type[]
* getGenericInterfaces() Type, 。
* , Type
* 。
* , 。 , ParameterizedType 。
*
* , , 。
* implements 。 , Cloneable
* Serializable 。
*
* , 。
* extends 。
*
* , 0 。
*
* void, 0 。
*
*
* :
*/
Type[] types = classTest.getGenericInterfaces();
System.out.print("Type[] getGenericInterfaces:");
// IClassTestC
for (Type type : types) {
// ParameterizedType , Collection<String>。
if (type instanceof ParameterizedType) {
System.out.print(" ParameterizedType:" + type.toString());
// ParameterizedType:complex.java.lang.IClassTestB<A, B>
// type Type[] ( )
Type[] ts = ((ParameterizedType) type)
.getActualTypeArguments();
System.out.print(" ts :" + ts.length);
for (Type t : ts) {
if (t instanceof ParameterizedType) {
// --------------------
System.out.print("ParameterizedType:"
+ t.toString() + " ");
}
// GenericArrayType ,
if (t instanceof GenericArrayType) {
System.out
.print("GenericArrayType:" + t.toString());
}
/**
* TypeVariable 。
* ( )。 t ( 、 )T
* , T T n ( JLS 8.1.2) , t
* ( JVMS 5)T i , i = 0 n( )。
* 。 。
* , 。
* , 。
* , (equal())。
* , 。
*/
// A,B
if (t instanceof TypeVariable) {
System.out.print(" TypeVariable:" + t.toString());
}
}
}
// ####################################
if (type instanceof GenericArrayType) {
System.out.print(" GenericArrayType :" + type.toString());
}
if (type instanceof TypeVariable) {
System.out.print(" TypeVariable :" + type.toString());
}
if (type instanceof WildcardType) {
System.out.print(" WildcardType :" + type.toString());
}
}
System.out
.println("
--------------------------------------------------------------------------------");
/** Type */
Type type = classTest.getGenericSuperclass();
System.out.println(" type:" + type.toString());
System.out
.println("---------------------------------------------------------------------------------");
/** ############################################# */
/** */
ClassTest ct = new ClassTest();
// public
Field[] fields = classTest.getFields();
//
fields = classTest.getDeclaredFields();
for (Field field : fields) {
// field.get(ct) ct field
System.out.println("ct's " + field.toGenericString() + ":"
+ field.get(ct));
}
System.out
.println("-----------------------------------------------------------------");
/** */
// public
Constructor[] constructors = classTest.getConstructors();
//
constructors = classTest.getDeclaredConstructors();
for (Constructor constructor : constructors) {
//
System.out.println(constructor.getName());
// Java
System.out.println(constructor.getModifiers());
Class<?>[] cs = constructor.getParameterTypes();
for (Class c : cs) {
System.out.println("constructor.getParameterTypes"
+ c.toString());
}
System.out.println(constructor.toGenericString());
}
/** */
// public
Method[] methods = classTest.getMethods();
//
methods = classTest.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.toGenericString());
}
//
Method method = classTest.getMethod("getTest", String.class);
// ct
method.invoke(ct, "++++++++++++++this getTest");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public String printC() {
// TODO Auto-generated method stub
return "classTest printC()";
}
public String getTest(String a) {
System.out.println(a);
return " classTest getTest(String a)";
}
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
public B getB() {
return b;
}
public void setB(B b) {
this.b = b;
}
}