美文网首页
java反射学习

java反射学习

作者: Wu巧不成 | 来源:发表于2017-05-31 17:00 被阅读0次

    上期作业:

    单向链表的删除如图所示

    单向链表删除.png

    但在队列中,是在头部或在尾部插入数据,往后或往前交换数据的方式达到目的,看需求而定。

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

    反射机制的作用:
    在运行时判断任意一个对象所属的类;
    在运行时构造任意一个类的对象;
    在运行时判断任意一个类所具有的成员变量和方法;
    在运行时调用任意一个对象的方法;
    生成动态代理 ????

    反射机制中的类:
    java.lang.Class;
    java.lang.reflect.Constructor; java.lang.reflect.Field;
    java.lang.reflect.Method;
    java.lang.reflect.Modifier;

    实例化class类对象,3种方法
    Class<?> class1 = null;
    Class<?> class2 = null;
    Class<?> class3 = null;
    class1 = Class.forName("StorageManager");
    class2 = new StorageManager().getClass();
    class3 = StorageManager.class;
    打印。。。。。。

    三、Java反射机制的调用:
    1、获取类对象:
    Class<?> clazz = Class.forName("包名.类名");
    2、获取类的父类:
    Class<?> parentClass = clazz.getSuperclass();
    3、获取类实现的接口:
    Class<?> intes[] = clazz.getInterfaces();
    4、实例化对象:
    实例化默认构造方法,可调用set、get赋值、取值
    User user = (User) clazz.newInstance();
    5、获取所有的构造方法:可使用构造函数赋值
    Constructor<?> cons[] = clazz.getConstructors();
    6、获取构造方法所需要的参数:
    Class<?> clazzs[] = cons[i].getParameterTypes();
    7、获取类的全部属性:
    Field[] field = clazz.getDeclaredFields();
    8、获取类属性的权限修饰符:
    int mo = field[i].getModifiers();
    String priv = Modifier.toString(mo);
    9、获取类属性的类型:
    Class<?> type = field[i].getType();
    10、获取类的全部方法:
    Method method[] = clazz.getMethods();
    11、获取方法的返回值类型:
    Class<?> returnType = method[i].getReturnType();
    12、获取方法的参数类型:
    Class<?> para[] = method[i].getParameterTypes();
    13、获得构造方法声明的异常:
    Class<?> exce[] = method[i].getExceptionTypes();

    14、反射调用类的方法:
    1、无参
    Method method = clazz.getMethod("方法1");
    method.invoke(clazz.newInstance());
    2、有参
    method = clazz.getMethod("方法2", int.class, String.class);
    method.invoke(clazz.newInstance(), 20, "张三");

    15、反射调用类的属性:
    Object obj = clazz.newInstance();
    // 可以直接对 private 的属性赋值
    Field field = clazz.getDeclaredField("proprety");
    field.setAccessible(true);
    field.set(obj, "修改属性");

    备注:以上的调用当然也可以获取父类的

    16、反射机制的动态代理:
    定义一个InvocationHandler接口的子类,已完成代理的具体操作,实现以下方法。
    public Object bind(Object obj) {
    this.obj = obj;
    //注意下面这句
    return Proxy.newProxyInstance(
    obj.getClass().getClassLoader(),
    obj.getClass().getInterfaces(), this);
    }

    相关文章

      网友评论

          本文标题:java反射学习

          本文链接:https://www.haomeiwen.com/subject/dksjfxtx.html