zoukankan      html  css  js  c++  java
  • Java基础回顾 —反射机制

    1. 无论生成某个类的多少对象,这些对象都会对应于同于个class。
      tips1: 反射的一切操作都是由Object完成,类、数组的引用都可以用Object进行接收。

    2. 要想使用反射,首先需要获得待处理类货对象所对应的Class对象。
      tips2: 所有类的对象实际上都是Class类的实例

    3. 获取某个类或某个对象对应的Class对象的3种方式:
      使用Class类的静态方法:forName
      使用类的.class语法: String.class
      使用对象的getClass()方法:String s = “aa”, Class<?> clazz = s.getClass();

    4. 若想通过类的不带参数的构造方法来生成对象,我们有两种方式:

      • 先获得Class对象,然后通过Class的newInstance()方法直接生成即可:Class<?> clazz = String.class, Object obj = clazz.newInstance();
        tips: 这个方式必须保证类中存在无参构造方法

      • 先获得Class对象,然后通过该对象获得对应的Constructor对象,在通过该Constructor对象的newInstance()生成:

        Class<?> clazz = String.class,
        Construcor cons = clazz.getCostructor(new Class[]{}),
        Object obj = cons.newInstance(new Object[]{});

    5. 若想通过带参数的构造方法生成对象,只能通过下面一种方式:

       Class<?> clazz = String.class,
       Construcor cons = clazz.getCostructor(new Class[]{int.class}), 
       Object obj = cons.newInstance(new Object[]{1}); 
      
       Class<?> clazz = Invoker.class;
       Constructorcons = clazz.getConstructor(new Class[]{String.class,int.class});
       Object obj = cons.newInstance(new Object[]{"GuangPing",27});
       Field field = clazz.getDeclaredField("name");
       field.setAccessible(true); //压制java对访问修饰符的检查
       field.set(obj, "LiPing");
       Invoker invoker = (Invoker)obj;
       System.out.println(invoker.getName());
       Method method = clazz.getDeclaredMethod("prints", new Class[]{});
       method.setAccessible(true);
       method.invoke(obj, new Object[]{});
      

    Git reflection code

  • 相关阅读:
    线性回归 r python 比较
    vps
    插桩 inline hook 动态二进制插桩的原理和基本实现过程
    duration of lease 1 0.5 0.875 DHCP 租借时间 续租时间 重新绑定时间
    单页应用 cookies处理
    websocket 无需通过轮询服务器的方式以获得响应 同步在线用户数 上线下线 抓包 3-way-handshake web-linux-shell 开发
    code_action
    mysql 表级锁
    mysql 表级锁
    块级标签和行级标签
  • 原文地址:https://www.cnblogs.com/nextStep/p/6688467.html
Copyright © 2011-2022 走看看