zoukankan      html  css  js  c++  java
  • 反射

    1.、什么是反射
    反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法

    2、类类
    所有狗 狗类 Dog 狗对象 旺财

    所有猫 猫类 Cat 猫对象 肥波

    所有类 类类 java.lang.Class 类对象 特定类

    3、反射获取类对象

    1  class.forname("类全路径名");
    2  类名.class
    3  类实例.getclass()  代码如下:

    package com.lingerqi.student;
     /**
      * 获取类对象
      * 1、class.forname("类全路径名");
      * 2、类名.class 
      * 3、类实例.getclass()
      * @author xyls
      *
      */
     public class test {
     
         public static void main(String[] args) throws ClassNotFoundException {
             Class fname = Class.forName("com.lingerqi.student.student");
             Class clz=student.class;
     //        student stu=new student();
     //        Class clz=stu.getClass();
             System.out.println(clz);
         }
     }
    

      

    4、 反射三大作用
    1 实例化对象
    c.newInstance():  代码如下:

    package com.lingerqi.student;
    
    import java.lang.reflect.Constructor;
    
    /**
     * 反射实例化
     * 1、能够实例化未知的类
     * @author xyls
     *
     */
    public class test2 {
    
        public static void main(String[] args) throws Exception {
            Class clz = student.class;
            // student stu=(student)clz.newInstance();
            // 调用一个参数的构造方法创建一个对象
            // Constructor con=clz.getConstructor(String.class);
            // student stu=(student)con.newInstance("s001");
            // 两个参数的构造方法创建对象
            // Constructor con=clz.getConstructor(String.class,String.class);
            // student stu=(student)con.newInstance("s001","zs");
            Constructor con = clz.getDeclaredConstructor(Integer.class);
            con.setAccessible(true);
            student stu = (student) con.newInstance(12);
    
        }
    }
    

      

    2 动态调用方法

    Method m;
    m.invoke

     package com.lingerqi.student;
      
      import java.lang.reflect.Method;
      
      /**
       * 反射调用方法
       * @author xyls
       *
       */
     public class test3 {
     
         public static void main(String[] args)throws Exception {
             student stu=new student();
     //        stu.hello();
             Class clz=stu.getClass();
     //        Method m=clz.getDeclaredMethod("hello");
     //        m.invoke(stu);
             Method m=clz.getDeclaredMethod("add", Integer.class,Integer.class);
             m.setAccessible(true);
             m.invoke(stu, 20,4);
         }
     }
    

      

    3 读写属性

    Field set/get

     package com.lingerqi.student;
     
     import java.lang.reflect.Field;
     
     /**
      * 反射的赋值取值
      * @author xyls
      *
      */
     public class test4 {
     
         public static void main(String[] args)throws Exception {
             student stu=new student();
             Class clz=stu.getClass();
     //        Field field=clz.getDeclaredField("sid");
     //        field.setAccessible(true);
     //        field.set(stu, "s002");
     //        System.out.println(field.get("stu"));
             Field[] fields=clz.getDeclaredFields();
             for (Field field : fields) {
                 field.setAccessible(true);
                 System.out.println(field.getName());
                 
             }
             
                 
         }
     }
    

      

  • 相关阅读:
    hdu 1402 大数A*B模板(FFT)
    ccpc 哈尔滨L题 LRU Algorithm
    今年得慢慢学的
    Codeforces Round #629 (Div. 3) E. Tree Queries(LCA)
    Codeforces Global Round 7 D2. Prefix-Suffix Palindrome (Hard version) -- manacher
    hdu 3068 (manacher算法)
    用Socket API建立简易tcp服务端和客户端
    Win下建立Socket时注意事项
    线段树(Segment Tree)
    Codeforces Round #643 (Div. 2)
  • 原文地址:https://www.cnblogs.com/omji0030/p/11025033.html
Copyright © 2011-2022 走看看