Java 反射

309 阅读2分钟

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();
        }
    }