1:获取 class type的方式
在Java世界里,万事万物皆对象。我们写的类是对象,是java.lang.Class类的实例对象。
// StuReflect 是java.lang.Class类的实例对象
public class StuReflect{}
//第一种方式
Class class1 = StuReflect.class;
//第二种方式
StuReflect stuReflect = new StuReflect();
Class class2 = stuReflect.getClass();
//第三种方式
try{
Class class3 = Class.forName("x.x.x.StuReflect")
}catch(Exception e){}
class1,2,3是等价的。也就是说一个类的class type有且只有一个。
2:通过 class type 创建对象实例
try{
StuReflect stuReflect = (StuReflect)class1.newInstance();
}catch(Exception e){}
3:获取方法信息
public static void getMethodMessage(Object obj){
//1:获取class type
Class classType = obj.getClass();
//2:获取类名称
classType.getName();
//3:获取Method数据
//一个成员方法就是一个Method对象。
//getMethods()方法获取的是所有的public的函数,包括父类继承而来的。
//getDeclaredMethods()获取该类 自己声明的所有方法,不问访问权限
// Method[] allMethods = classType.getDeclaredMethods();
Method[] methods = classType.getMethods();
for(int i=0;i<methods.length;i++){
//4:得到方法返回值类型class type
Class returnType = methods[i].getReturnType();
//得到方法的名称
methods[i].getName();
//5:获取方法参数类型,得到的是参数列表类型的 class type
Class[] paramTypes = methods[i].getParameterTypes();
for (Class paramsType:paramTypes){
paramsType.getName();
}
}
}
4:获取成员变量信息
public static void getFieldMessage(Object obj){
//1:获取class type
Class classType = obj.getClass();
//2:获取类名称
classType.getName();
//3:获取成员变量数组
//成员变量也是对象,java.lang.reflect.Field的实例对象
//getFields()获取所有 的public的成员变量的信息,包含父类
//getDeclaredFieldes()获取该类声明的所有属性,不问 访问权限
Field[] fields = classType.getDeclaredFields();
for (Field field:fields){
//4:获取成员变量的class type
Class fieldType = field.getType();
String fieldTypeName = fieldType.getName();
//5:获取成员变量的名称
String fieldName = field.getName();
}
}
5:获取构造函数信息
public void getConstructorMessage(Object obj){
//1:获取class type
Class classType = obj.getClass();
//2:获取类名称
classType.getName();
//3:获取构造函数数组
//构造函数也是对象,是java.lang.Constructor类的实例对象
//getConstructors()获取所有的public的构造函数,包含父类
//getDeclaredContructors()得到该类自己声明的构造函数
Constructor[] constructors = classType.getDeclaredConstructors();
for (Constructor constructor:constructors){
//4:获取到构造函数的参数列表数组
Class[] paramTypes = constructor.getParameterTypes();
for (Class paramType:paramTypes){
//5:获取构造函数的参数的class type
paramType.getName();
}
}
}
6:方法反射
public void methodInvoke(Object obj){
//1:获取要反射的方法
//a:获取class type
Class classType = obj.getClass();
Method method;
try {
method = classType.getMethod("get",String.class,String.class);
//要获取的方法 public void get(String url,String params){...}
//2:进行方法反射
method.invoke(obj,"www.baidu.com","name=12");
} catch (Exception e) {
e.printStackTrace();
}
}