Java反射的应用

来源:互联网 发布:中国法律 知乎 编辑:程序博客网 时间:2024/05/18 02:26

    最近想了解一下SSH源码, 框架大部分功能实现用到了反射,所以花时间研究了一下。

    何为反射?白话就是通过一个类获得它的对象,方法,成员变量;通过一个对象,调用它的任意一个方法和对象;

    刚开始学反复强调:OOP中万事万物皆对象,而类, 是Class类的对象.

反射中,动态加载一个类的方式有三种:(拿Car类举例)

Class car1 = Car.class;

Class car2 = new Car().class;

Class car3 = Class.forName("com.car.Car");

现在car1,car2,car3就分别表示了Car类的类类型(class type);


获得一个类的基本信息:

Class car1 = Car.class;

System.out.println("类名:" + car1.getName());

//获取这个类的方法

Method[] method = car1.getMethods();

/*

 *这里要说一下,getMethods()获得的是所有public修饰的方法,包括从父类继承而来的;

 *而getDeclaredMethods()是获得所有本类生命的方法,无视访问权限;

 *同样的用法还有getFields 和 getDeclaredFields(获得成员变量),getConstructors 和 getDeclaredConstructors(获得构造方法)等

 */

for(Method method : methods){
            
            System.out.print("方法名称" + method.getName());//得到方法名称
            //得到参数列表类型的class type
            Class[] paramTypes = method.getParameterTypes();
            
            for(Class paramType : paramTypes){
                System.out.print(paramType.getSimpleName());//获得参数信息
            }
            System.out.println("返回值类型:" + method.getReturnType().getName());//getReturnType()得到的是方法返回值类型的class type
 }



//获取这个类的成员变量


Field[] field = car1.getFields();
for(Field field : fields){
            //得到成员变量类型的class type
            Class fieldType = field.getType();
            //得到成员变量名称
            String fieldName = field.getName();
            //得到成员变量类型
            String fieldTypeName = fieldType.getName();
            System.out.println("成员变量类型:" + fieldType + ";成员变量名称" + fieldName );
 }


//获取构造函数

Constructor[] cs = car1.getDeclaredConstructors();
        for(Constructor constructor : cs){
            System.out.print("构造方法:" + constructor.getName() + "(");
            //获取构造函数的参数列表 -->获得的是参数列表的类类型
            Class[] paramTypes = constructor.getParameterTypes();
            for(Class paramType : paramTypes) {
                System.out.print(paramType.getName() + ",");
            }
            System.out.println(")");
 }


/*

 *方法的反射

 *用Method的对象进行方法调用 等同于 对象.方法名(参数);

 */

//获取Car类的test(int a,Stringb)方法

Method method = car1.getDeclaredMethod("test",new Class[]{int.class,String.class});

//调用该方法

Object returnValue = method.invok(car1,new Object[]{2,"test"});

//returnValue就是"test"方法的返回值



0 0
原创粉丝点击