反射

作者: Anwfly | 来源:发表于2020-07-26 14:30 被阅读0次

    一、 注解的定义
    反射是通过class文件对象获取java类的构造方法、成员方法、属性、静态代码块等。
    二、使用

    1. 获取字节码文件
    //1.通过Object的getClass()方法
    Class cls = person.getClass()
    
    //2.通过数据类型的静态属性class
    Class cls = Person.class
        
    //3.通过Class类的静态方法forName()
    Class cls = Class.forName("com.jiyun.Person");
    
    1. 通过反射获取无参构造、有参构造、私有构造方法并使用
      实体类:
    public class Dog {
        private String name;
        public String color;
        public static String des = "狗有四条腿,长舌头,汪汪叫";
    
        public Dog() {
        }
    
        public Dog(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void show() {
            System.out.println("我是" + name);
        }
    
        public int cal(int a, int b) {
            return a + b;
        }
    
        public static void profile() {
            System.out.println("狗是人类的朋友");
        }
    }
    

    (1)反射获取无参构造

    代码:

    //反射获取无参构造两种方式
    Constructor<?> constructor = cls.getConstructor();
    Constructor<?> constructor = cls.getConstructor(null);
    

    案例:

    public class Test {
        public static void main(String[] args) throws Exception {
            Class<Dog> cls = Dog.class;
            //1.获取无参构造方法并使用
            Constructor<?> constructor1 = cls.getConstructor();
    //        Constructor<?> constructor1 = cls.getConstructor(null);
    
            //通过无参构造方法生成对象:
            Object obj1 = constructor1.newInstance();
    //        Object obj1 = constructor1.newInstance(null);
            Dog dog = (Dog) obj1;
            dog.setName("哈士奇");
            dog.show();
        }
    }
    

    (2) 反射获取有参构造方法

    代码:

    //反射获取有参构造方法
    Constructor<?> constructor = cls.getConstructor(new Class[]{String.class});
    

    案例:

    public class Test {
        public static void main(String[] args) throws Exception {
            Class<Dog> cls = Dog.class;
            //2.获取有参构造方法并使用
            Constructor<?> constructor = cls.getConstructor(new Class[]{String.class});
    
            //通过无参构造方法生成对象:
            Object obj = constructor.newInstance(new Object[]{"哈士奇"});
            Dog dog = (Dog) obj;
            dog.show();
        }
    }
    

    (3) 反射获取私有构造方法

    代码:

    //反射获取私有构造方法
    Constructor<?> constructor = cls.getDeclaredConstructor(); 
    

    案例:

    public class Test {
          public static void main(String[] args) throws Exception {
               Class<Dog> cls = Dog.class;
       
               //获取私有构造方法并使用
               Constructor<?> constructor = cls.getDeclaredConstructor();
       
               //通过无参构造方法生成对象:
               constructor.setAccessible(true);
               Object obj = constructor.newInstance();
               Dog dog = (Dog) obj;
               dog.setName("哈士奇");
               dog.show();
           }
     }
    
    1. 通过反射获取无参无返回值、带参有返回值成员方法并使用
      (1)获取无参无返回值的方法
      代码:

      //获取无参无返回值的方法
      Method mth = cls.getMethod("show");
      Method mth = cls.getMethod("show",null);
      

      案例:

      public class Test {
          public static void main(String[] args) throws Exception {
              Class<Dog> cls = Dog.class;
              Constructor<?> constructor1 = cls.getConstructor();
              Object obj = constructor1.newInstance();
              Dog dog = (Dog) obj;
      
              //获取无参无返回值的方法
              Method mth = cls.getMethod("show");
      //        Method mth = cls.getMethod("show","哈士奇");
      
              //调用show方法:
              dog.setName("哈士奇");
      //        mth.invoke(obj, nul);
              mth.invoke(dog);
      }
      

    (2)获取有参有返回值的方法

    代码:

    //获取有参有返回值的方法
    Method mth = cls.getMethod("cal", new Class[]{int.class,int.class});
    

    案例:

    public class Test {
        public static void main(String[] args) throws Exception {
            Class<Dog> cls = Dog.class;
            Constructor<?> constructor1 = cls.getConstructor();
            Object obj = constructor1.newInstance();
    
            //2.获取有参有返回值的方法
            Method mth = cls.getMethod("cal", new Class[]{int.class,int.class});
    
            //调用cal方法:
            Object result = mth.invoke(obj,new Object[]{2,6});
            int sum = (int) result;
            System.out.println(sum);
        }
    }
    

    (3)获取无参无返回值静态方法

    代码:

    //获取无参无返回值静态方法 
    Method mth = cls.getMethod("profile");
    Method mth = cls.getMethod("profile",null);
    

    案例:

    public class Test {
        public static void main(String[] args) throws Exception {
            Class<Dog> cls = Dog.class;
    
            //获取无参无返回值静态方法
            Method mth = cls.getMethod("profile");
    //        Method mth = cls.getMethod("profile",null);
    
            //调用静态方法
            mth.invoke(null);
    //        mth.invoke(null,null);
        }
    }
    
    1. 通过反射获取成员变量并使用
      (1)获取非私有成员变量
      代码:

      //获取非私有成员变量 
      Field field = cls.getField("color");
      

      案例:

      public class Test {
          public static void main(String[] args) throws Exception {
              Class<Dog> cls = Dog.class;
              Constructor<?> constructor1 = cls.getConstructor();
              Object obj = constructor1.newInstance();
      
              //1.获取非私有成员变量
              Field field = cls.getField("color");
      
              //给非私有成员变量赋值:
              field.set(obj, "yellow");
              //获取非私有成员变量的值:
              Object color = field.get(obj);
              System.out.println("狗的颜色是:"+color);
          }
      }
      

    (2)获取私有成员变量
    代码:

    //获取私有成员变量 
    Field field = cls.getDeclaredField("name");
    

    案例:

    public class Test {
        public static void main(String[] args) throws Exception {
            Class<Dog> cls = Dog.class;
            Constructor<?> constructor1 = cls.getConstructor();
            Object obj = constructor1.newInstance();
    
            //2.获取私有成员变量
            Field field = cls.getDeclaredField("name");
    
            //给私有成员变量赋值:
            field.setAccessible(true);
            field.set(obj, "大黄");
    
            //获取私有成员变量的值:
            field.setAccessible(true);
            Object name = field.get(obj);
            System.out.println("狗的名字是:" + name);
        }
    }
    

    (3)获取静态成员变量

    代码:

    //获取私有成员变量 
    Field field = cls.getField("des");
    

    案例:

    public class Test {
        public static void main(String[] args) throws Exception {
            Class<Dog> cls = Dog.class;
    
            //获取静态成员变量
            Field field = cls.getField("des");
    
            //给静态成员变量赋值:
            field.set(null, "啦啦啦");
            //获取非私有成员变量的值:
            Object des = field.get(null);
            System.out.println("狗得描述:" + des);
        }
    }
    

    相关文章

      网友评论

          本文标题:反射

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