Java基础之反射机制

来源:互联网 发布:js时间戳计算时间差 编辑:程序博客网 时间:2024/05/14 16:54

反射机制

JAVA有着一个非常突出的动态相关机制:反射。JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

反射使用

获取Class实例

获取Class实例有三种方法可以获取。实际上前两种方法也带有了包名,类实例getName方法就可以获得。第三种方法的好处,用字符串拼写指定任意包名路径,灵活性强。比如从xml文件获取的包名字符串。

    Class<?> cls = Apple.class    Class<?> cls = new Apple().getClass();    Class<?> cls = Class.forName("com.xxx.Apple");  //推荐    cls.getName();//com.xxx.Apple

实例化对象

有了Class实例就可以快乐地玩耍。所有属性和方法都在Class实例里面,还有实例化对象。

    Apple apple = (Apple) cls.newInstance();

实例化对象就是这么简单,但只是调用无参构造函数。想要调用有参构造函数。就要调用Class实例的getConstructors方法获取所有构造器。要注意的是只能获取非私有的构造器,同样的调用非私有的构造器会抛异常。

        Constructor<?>[] constructors = cls.getConstructors();        for(Constructor<?> cons : constructors){            Class<?>[] params = cons.getParameterTypes();//获取构造器中的参数类型        }        apple = (Apple) constructors[1].newInstance(new Color());//public Apple(Color c)        apple = (Apple) constructors[2].newInstance("apple");//public Apple(String name)

反射字段

获取字段也很简单。调用Class实例的getDeclaredFields方法获取本类字段,也可以调用getFields方法获取父类或接口的字段。调用字段只要找到相应的属性名,然后通过set方法传入对象和值就好了。要注意的是私有字段要setAccessible为true。

    Field[] fields = cls.getDeclaredFields();//获取字段    for (Field f : fields) {        String m = Modifier.toString(f.getModifiers());//获取字段修饰符        f.getType();//获取字段类型        f.getName();//获取字段名    }    //反射字段调用    Object obj = cls.newInstance();    Field field = cls.getDeclaredField("name");    field.setAccessible(true);//修改私有字段必须设置true    field.set(obj, "apple");    System.out.println(field.get(obj));

反射方法

反射方法跟反射字段都差不多。

    Method[] methods = cls.getMethods();    for (Method m : methods) {        m.getReturnType();//获取方法返回类型        m.getParameterTypes();//获取方法参数类型        String mod = Modifier.toString(m.getModifiers());//获取方法修饰符        m.getExceptionTypes();//获取方法异常    }    //反射方法调用    Object obj = cls.newInstance();    //获取私有的private void setName(String name)    Method method = cls.getDeclaredMethod("setName", String.class);    method.setAccessible(true);//允许修改私有    method.invoke(obj, "apple");//调用方法    //获取公共无参printName方法    method= cls.getDeclaredMethod("printName");    method.invoke(obj);//调用方法

反射应用

反射机制使代码在运行时灵活获取信息。用的范围也很多。比如上面说的读取文件创建对象,动态工厂模式创建对象,运行时强行修改私有值,改变数组大小等等,有时间可以专门再写一篇。不懂点反射机制都不敢说自己是学Java的。本章就到这里,不足之处望指教。

0 0
原创粉丝点击