Java反射机制

来源:互联网 发布:鲅鱼圈网络维护 编辑:程序博客网 时间:2024/05/19 23:10

1.什么是反射?

  Java的反射就是指在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意属性和方法。这种动态获取信息以及动态调用对象方法的功能被称为Java的反射机制。

2.使用反射

 2.1 获取class对象
//第一种,类的class Class c = Student.class;//第二种,实例对象的getClass方法 Class c = new Student().getClass();//第三种,根据类路径获取 Class c = Class.forName("zhangff01.vo.Student");
 2.2获取类的属性和方法并调用
//测试类,为求简介舍去get/set方法public class BaseClassA{    public String basePub = "base public field";    private String basePri = "base private field";    ...}public class ClassA extends BaseClassA{    public String pubField = "public field";    private String prifield = "private field";    ClassA() { }    ClassA(String a, String b) {        this.prifield = a;        this.pubField = b;    }    ...}
     public static void main(String[] args) throws Exception {        ClassA classA = new ClassA();        Class<?> aClass = classA.getClass();        //获取类所有属性,不包括基类        Field[] declaredfields = aClass.getDeclaredFields();        //获取类的所有public属性 包括基类        Field[] fields = aClass.getFields();        for (Field field : declaredfields) {            //设置private对象为可访问            field.setAccessible(true);            //获取具体对象该属性的具体值            String value = (String) field.get(classA);            System.out.println(field.getName() + "的值为:" + value);        }        for (Field field : fields) {            //获取具体对象该属性的具体值            String value = (String) field.get(classA);            System.out.println(field.getName() + "的值为:" + value);        }        //根据属性名获取具体的某一项属性(不包括基类)        Field Declaredfield = aClass.getDeclaredField("prifield");        //根据属性名获取具体的某一项public属性(基类)        Field field = aClass.getField("basePub");        //获取类的方法类似        //获取类所有方法,不包括基类        Method[] declaredMethods = aClass.getDeclaredMethods();        //获取类的所有public方法 包括基类        Method[] methods = aClass.getMethods();        for (Method method : declaredMethods) {            //设置private方法为可访问            method.setAccessible(true);            //调用方法,入参为方法调用的具体对象和方法的参数            method.invoke(classA, "");        }        //根据方法名和参数类型获取具体方法        aClass.getDeclaredMethod("setPrifield", String.class);        aClass.getMethod("setPubField", String.class);    }
 2.3 对象实例化
 public static void main(String[] args) throws Exception {        Class<?> aClass = ClassA.class;        //对于有空的构造函数的类可以直接用class.newInstance()获取实例        Object objA = aClass.newInstance();        //如果没有空的构造函数的类则需要先获取到类的构造方法,在通过该构造方法类获取实例        //获取构造函数(参数为相应构造方法的参数)        Constructor<?> constructor = aClass.getConstructor(String.class, String.class);        //调用构造方法(需要带上相应构造方法的参数)        constructor.newInstance("a", "b");        //以下几个方法和获取属性的方法基本差不多,可以类推出它的功能        //aClass.getConstructor();        //aClass.getConstructors();        //aClass.getDeclaredConstructor();        //aClass.getDeclaredConstructors();        //constructor.setAccessible(true);    }
原创粉丝点击