package classReflex;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 通过类的对象 反射得到类的类类型、类的成员参数和类的成员方法 <br/>
* 也都只是访问当前类类型可以访问的属性和方法!注意:子类无法访问父类的私有属性和方法<br/>
* 查看方法时不必考虑是否是private,public,protected。但是在利用反射调用方法时就要考虑方法的是否是private了,<br/>
* 如果需要利用反射使用类类型调用类的私有方法时,就要在获得属性或者方法后,先声明是访问无障碍的,setAccessible(true)
*
* @author 杰仔
*
*/
public class classUtil {
public static void printStructureMethod(Object object) {
Class c = object.getClass();
// 获得类的名字,传入的是什么类型,就表示什么类型,而不是父类object类型。
System.out.println("类的名称:" + c.getName());
System.out.println("类的构造方法:");
Constructor[] constructors = c.getConstructors();
for (int i = 0; i < constructors.length; i++) {
Constructor constructor = constructors[i];
System.out.print(constructor.getName() + " (");
Class[] parameterTypes = constructor.getParameterTypes();
for (int j = 0; j < parameterTypes.length; j++) {
Class parameterType = parameterTypes[j];
if (j != 0)
System.out.print(" , ");
System.out.print(parameterType.getSimpleName());
}
System.out.println(")");
}
}
public static void printClassMethod(Object object) {
// 首先获得类的信息,先获得类的类型。
Class c = object.getClass();
// 获得类的名字,传入的是什么类型,就表示什么类型,而不是父类object类型。
System.out.println("类的名称:" + c.getName());
System.out.println("类的成员方法:");
/*
* Method类型是方法的类型。即:方法也是对象,是类型Method的对象
* getMethods()获得类的所有成员方法,包括从父类继承来的方法
* getDeclaredMethods()获得类自己定义的成员方法。不包含父类的方法
*/
// Method[] methods = c.getMethods();
Method[] methods = c.getDeclaredMethods();
for (Method method : methods) {
// 获得方法的返回值的类类型
Class returnTyoe = method.getReturnType();
System.out.print(returnTyoe.getSimpleName() + " " + method.getName() + "(");
// 获得方法所有的形参数组
Class[] parameterTypes = method.getParameterTypes();
for (int i = 0; i < parameterTypes.length; i++) {
Class parameterType = parameterTypes[i];
if (i != 0)
System.out.print(" , ");
System.out.print(parameterType.getSimpleName() + " par" + i);
}
System.out.println(");");
}
System.out.println("methods.length-->" + methods.length);
/**
* 利用反射调用public方法f0();<br/>
* 先获得方法的对象Method类型的,由方法对象调用对象的方法
*/
Method m;
try {
m = c.getMethod("f0", null);
m.invoke(c.newInstance(), null);// 通过类的对象调用对象的方法,后面的是参数
// 如果的调用静态方法,就不必传入类的对象了,而只需要传递类类型就可以了m.invoke(c, null);
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException | InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 利用反射调用private方法f0(); <br/>
* m_private.setAccessible(true);//访问私有方法的关键步骤,设置为访问无障碍
*/
Method m_private;
try {
m_private = c.getDeclaredMethod("f0_private", null);
m_private.setAccessible(true);// 访问私有方法的关键步骤,设置为访问无障碍,但是也只能访问该类类型能访问到的方法,子类就无法访问父类的私用方法
m_private.invoke(c.newInstance(), null);
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException | InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void printClassAttribute(Object object) {
// 首先获得类的信息,先获得类的类型。
Class c = object.getClass();
// 获得类的名字,传入的是什么类型,就表示什么类型,而不是父类object类型。
System.out.println("类的名称:" + c.getName());
System.out.println("类的成员属性:");
Field[] Fields = c.getDeclaredFields();
if (Fields.length > 0) {
for (Field field : Fields) {
Class type = field.getType();
System.out.println("field.getName()-->" + field.getName());
System.out
.println(field.getModifiers() + " " + type.getSimpleName() + " m" + type.getSimpleName() + ";");
}
} else {
System.out.println("没有成员属性");
}
}
}