Java基础之反射机制

反射机制

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值