package cn.lonecloud.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
public class ClassUtil {
/**
* 獲取該類的信息
* 比如他的類的類名和函數
* @param obj
*/
public static void getClassInfo(Object obj){
//獲取obj的類類型
Class c1=obj.getClass();
System.out.println("類的類型為"+c1.getName());
System.out.println("類的類型為"+c1.getSimpleName());
//獲取類的類方法包括其父類的方法
Method[] methods=c1.getMethods();
System.out.println("該類的方法為");
int c=0;
for (int i = 0; i < methods.length; i++) {
c++;
Class returntype=methods[i].getReturnType();//獲取該類的返回值
System.out.print(returntype.getSimpleName()+" ");//打印返回值
System.out.print(methods[i].getName()+"(");//打印方法名
Class[] prams=methods[i].getParameterTypes();//獲取參數的方法
for (int j = 0; j < prams.length; j++) {
System.out.print(prams[j].getSimpleName()+" ");//打印參數名
}
System.out.println(")");
}
System.out.println("利用getDeclaredMethods");
//獲取類的本類方法,不包含父類的方法可以獲取他的類里面的所有方法
Method[] methods1=c1.getDeclaredMethods();
System.out.println("該類的方法為");
int count=0;
for (int i = 0; i < methods1.length; i++) {
count++;
Class returntype=methods1[i].getReturnType();//獲取該類的返回值
System.out.print(returntype.getSimpleName()+" ");//打印返回值
System.out.print(methods1[i].getName()+"(");//打印方法名
Class[] prams=methods1[i].getParameterTypes();//獲取參數的方法
for (int j = 0; j < prams.length; j++) {
System.out.print(prams[j].getSimpleName()+" ");//打印參數名
}
System.out.println(")");
}
System.out.println(c+" "+count);
}
/**
* 獲取構造方法
* @param obj
*/
public void getConMethod(Object obj){
Class c=obj.getClass();
//獲取類的構造方法
Constructor[] declaredConstructors = c.getDeclaredConstructors();
for (Constructor constructor : declaredConstructors) {
System.out.print(constructor.getName()+"(");
Class[] parameterTypes = constructor.getParameterTypes();
for (Class class1 : parameterTypes) {
System.out.print(class1.getName());
}
}
System.out.println(")");
}
public void getClassFields(Object obj) {
Class c=obj.getClass();
//獲取該類的成員變量
Field[] declaredFields = c.getDeclaredFields();
for (Field field : declaredFields) {
//獲取成員變量的類型
System.out.print(field.getType().getName()+" ");
//獲取成員變量的名稱
System.out.println(field.getName());
}
}
public void runClassMethod(Object obj) throws Exception{
Class c1=obj.getClass();//獲取類類型
/*
* c1.getDeclaredMethod("syso", parameterTypes)
* 第一個是方法名,第二個為參數
*/
Method m1=c1.getDeclaredMethod("de");
m1.setAccessible(true);//設置這個方法的權限為public但是不會改變該方法的原有的權限
/*
* invoke(obj)對於指定的方法執行第一參數為這個對象,第二個為函數參數
*/
System.out.println(m1.invoke(obj));
}
@Test
public void test() throws Exception{
// String s="cewc";
// getClassInfo(s);
word w=new word();
getClassInfo(w);
getConMethod(w);
getClassFields(w);
runClassMethod(w);
}
}