Java反射

反射入门

在方法区存在这么一些对象,叫做类对象,他们表述了我们写的所有的类,当我们new对象时会根据这些类对象,并调用其构造方法为我们创建实例。

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

简单的说:一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分。

Java反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类;

  • 在运行时构造任意一个类的对象;

  • 在运行时判断任意一个类所具有的成员变量和方法;

  • 在运行时调用任意一个对象的方法;生成动态代理

反射的API介绍

简述:我们写的所有的类,都会被appclassloader加载到内存的方法区,生成一个Class类型的对象,他们即是你写的class,又是Class的实例,也叫说明书的说明书。

Java反射的类主要有java.lang.Class类和java.lang.reflect包中的Filed、Consturctor、Method、Annotation类

示例实体类User

 Class User(){
     public String name;
     private int age;
     
     public void login(){
         System.out.println("login...")
    }
     
    public void login(String username){
         System.out.println(username + " login...")
    }
     
     public void login(String username, String password){
         System.out.println(username + " login...," + "password is " + password)
    }
     
 }
  1. 获取类对象的方法

     // 1、使用类
     Class clazz = User.class;
     
     // 2、使用类全名
     Class clazz = Class.forName("com.jarreet.pojo.User");
     
     // 3、使用对象
     User user = new User();
     Class clazz = user.getClass();
  2. 对类对象进行操作

     // 获取类名字
     String name = clazz.getName();
     // 获取类加载器
     ClassLoader classLoader = clazz.getClassLoader();
     // 获取资源
     URL resource = claszz.getResource("");
     // 获取资源流
     InputStream resourceAsStream = clazz.getResourceAsStream("");
     // 得到父类
     Class superclass = clazz.getSuperclass();
     // 判断一个类是不是接口,数组等等
     boolean array = clazz.isArray();
     boolean anInterface = clazz.isInterface();
     
     // 重点:使用class对象实例化一个对象
     Object instance = clazz.newInstance();
  3. 将字段并操作

    • 获取字段

       // 获取字段,只能获取公共的字段(public)
       Field name = clazz.getField("name");
       Fidle[] fields = claszz.getFields();
       
       // 能获取所欲字段
       Field age = clazz.getDeclaredField("age");
       Field[] declaredFields = clazz.getDeclaredFields();
    • 获取对象的属性

       User user = new User();
       user.setAge("18");
       Class clazz = User.class;
       Field age = clazz.getDeclaredField("age");
       System.out.println(age.get(user));
    • 设置对象的属性

       User user = new User();
       user.setName("Jarreet");
       Class clazz = User.class;
       Field age = clazz.getDeclaredField("age");
       age.set(user,"18");
       System.out.println(age.get(user));
       // 暴力注入
       Field age = dogClass.getDeclaredField("age");
       //暴力注入
       age.setAccessible(true);
       age.set(user,"20");
  4. 方法

    • 获取方法

       // 根据名字和参数类型获取一个方法
       Method method = clazz.getMethod("login", String.class);
       Method[] methods = clazz.getMethods();
       
       Method declaredMethod = clazz.getDeclaredMethod("login", String.class);
       Method[] declaredMethods = clazz.getDeclaredMethods();
    • 对方法的操作

       User user = new User();
       user.setAge("18");
       Class clazz = User.class;
       // 读取某个方法,名字,后边是参数类型
       Method method = clazz.getMethod("login", String.class);
       // 拿到参数个数
       int parameterCount = method.getParameterCoun();
       // 拿到方法的名字
       String name = method.getName();
       // 拿到参数的类型数组
       Class<?>[] parameterTypes = method.getParameterTypes();
       // 拿到返回值类型
       Class<?> returnType = method.getReturnType();
       
       // 重点:反射调用方法,传一个实例和参数
       method.invoke(user,"Jarreet558")
       Class userClass = Class.forName("com.jarreet.pojo.User");
       Object user = userClass.newInstance();
       
       Method login = userClass.getMethod("login");
       login.invoke(user);
       
       Method login2 = userClass.getMethod("login", String.class);
       login.invoke(user, "Jarreet558");
       
       Method login3 = userClass.getMethod("login", String.class, String.class);
       login.invoke(user, "Jarreet558", "123456");
  5. 构造函数

    • 获取并构建对象

       Constructor[] constructors = clazz.getConstructors();
       Constructor constructor = clazz.getConstructor();
       Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
       Constructor declaredConstructor = clazz.getDeclaredConstructor();
       
       
       Object obj = constructor.newInstance();
  6. 注解

    • 从方法、字段、类上获取注解

       //元注解 要加上runtime
       //类上
       Annotation annotation = clazz.getAnnotation(Bean.class);
       Annotation[] annotations = clazz.getAnnotations();
       
       //字段上
       Annotation annotation = field.getAnnotation(Bean.class);
       Annotation[] annotations = field.getAnnotations();
       
       //方法上
       Annotation annotation = method.getAnnotation(Bean.class);
       Annotation[] annotations = method.getAnnotations();



posted @ 2021-05-06 00:35  离渊灬  阅读(38)  评论(0)    收藏  举报