import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
public class DynamicClass {
private String name;
private String sex;
public static void main(String[] args) throws ClassNotFoundException {
/*
* 萬事萬物皆對象
* 所有的類都是Class類的對象,所有的方法都是Method類的對象,所有的
* 每個類都存在class的靜態成員參數
* 表示類的唯一標識 類類型
*/
System.out.println("DynamicClass .class : " + DynamicClass.class);
/*
* 每個類的對象,都具有一個getClass方法 用來獲取類類型
* 類類型是Class類的對象
*/
System.out.println("DynamicClass .getClass : " + new DynamicClass().getClass());
/*
* 一個類的類類型是唯一的,也是一個定值。相同的類的類類型是相等的。
*/
System.out.println(DynamicClass.class == new DynamicClass().getClass());
/*
* 通過Class.forName方法獲取的類類型
*/
Class dynamicClass = Class.forName("com.haut.zm.test.DynamicClass");
System.out.println("Class forName : " + dynamicClass);
System.out.println("=========================");
/*
* 獲取類自己所有的方法,不包含繼承方法
*/
Method[] methods = dynamicClass.getDeclaredMethods();
/*
* lambda也是method方法的一個對象
*/
Arrays.stream(methods).forEach(method -> {
System.out.println("++++++++++++");
System.out.println(method.getName());
/*
* 方法返回類型 如果沒有返回值是void的,說明void也是Class類的類類型
*/
System.out.println("returnType : " + method.getAnnotatedReturnType().getType());
Class[] parameterTypes = method.getParameterTypes();
for(Class parameterType : parameterTypes) {
System.out.print("parameterType : " + parameterType.getName() + "\t");
System.out.println();
}
System.out.println();
});
System.out.println("--------------");
/*
* 獲取所有的成員變量信息
*/
Field[] fields = dynamicClass.getDeclaredFields();
System.out.println("field : ");
for(Field field : fields) {
System.out.print(field.getName() + " : " + field.getType() + "\t");
}
System.out.println();
System.out.println("****************");
/*
* 構造方法,及參數類型
*/
Constructor[] declaredConstructors = dynamicClass.getDeclaredConstructors();
for (Constructor declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor.getName());
for (Class parameterType : declaredConstructor.getParameterTypes()) {
System.out.println(parameterType.getName());
}
}
System.out.println("^^^^^^^^^^^^^^^^");
/*
* 動態加載類
*/
try {
Class c = Class.forName("com.haut.zm.test.Word");
OfficeAble officeAble = (OfficeAble) c.newInstance();
officeAble.start();
} catch (Exception e) {
e.printStackTrace();
}
}
private DynamicClass(){}
public DynamicClass(String name) {
this.name = name;
}
public DynamicClass(String name, String sex) {
this.name = name;
this.sex = sex;
}
private void print(String print) {
System.out.println("print : " + print);
}
private void print(String print, int type, String name) {
System.out.println(name + print + type);
System.out.println(int.class);
}
}
interface OfficeAble{
void start();
}
class Word implements OfficeAble{
@Override
public void start() {
System.out.println("word start...");
}
}
class Excel implements OfficeAble{
@Override
public void start() {
System.out.println("excel start...");
}
}