编程语言
首页 > 编程语言> > Java反射机制

Java反射机制

作者:互联网

概述

反射机制是指在运行状态中能获取任意一个类的属性和方法,能调用任意一个对象的方法和属性。

能动态获取对象信息以及调用对象方法的功能为java的反射机制

获取Class对象的四种方式

要动态的获取这些信息需要Class对象,通过该对象可以将一个类的方法、变量信息告诉程序。
有四种方式获取Class对象

  1. 知道具体类
Class alunbarClass = TargetObject.class;
  1. Class.forName()传入类路径
Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");

Class.forName(className)方法,内部实际调用的是一个native方法 forName0(className, true, ClassLoader.getClassLoader(caller), caller);
第2个boolean参数表示类是否需要初始化,Class.forName(className)默认是需要初始化。
一旦初始化,就会触发目标对象的 static块代码执行,static参数也会被再次初始化。

  1. 通过对象实例instance.getClass()获取
Employee e = new Employee();
Class alunbarClass2 = e.getClass();
  1. 通过类加载器xxxClassLoader.loadClass()传入类获取路径
class clazz = ClassLoader.LoadClass("cn.javaguide.TargetObject");

通过类加载器获取Class对象不会进行初始化,意味着不进行包括初始化等一些列步骤,静态块和静态对象不会得到执行。

代码测试

  1. 要使用反射操作的类
package cn.javaguide;

public class TargetObject {
    private String value;

    public TargetObject() {
        value = "JavaGuide";
    }

    public void publicMethod(String s) {
        System.out.println("I love " + s);
    }

    private void privateMethod() {
        System.out.println("value is " + value);
    }
}

  1. 使用反射操作这个类的方法和参数
package cn.javaguide;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {
        /**
         * 获取TargetObject类的Class对象并且创建TargetObject类实例
         */
        Class<?> tagetClass = Class.forName("cn.javaguide.TargetObject");
        TargetObject targetObject = (TargetObject) tagetClass.newInstance();
        /**
         * 获取所有类中所有定义的方法
         */
        Method[] methods = tagetClass.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }
        /**
         * 获取指定方法并调用
         */
        Method publicMethod = tagetClass.getDeclaredMethod("publicMethod",
                String.class);

        publicMethod.invoke(targetObject, "JavaGuide");
        /**
         * 获取指定参数并对参数进行修改
         */
        Field field = tagetClass.getDeclaredField("value");
        //为了对类中的参数进行修改我们取消安全检查
        field.setAccessible(true);
        field.set(targetObject, "JavaGuide");
        /**
         * 调用 private 方法
         */
        Method privateMethod = tagetClass.getDeclaredMethod("privateMethod");
        //为了调用private方法我们取消安全检查
        privateMethod.setAccessible(true);
        privateMethod.invoke(targetObject);
    }
}

调用私有方法属性时需要使用xxx.setAccessible(true); 取消安全检查

静态编译与动态编译

反射机制优缺点

应用场景

标签:反射,Java,初始化,对象,获取,tagetClass,机制,Class,TargetObject
来源: https://blog.csdn.net/renweiyi1487/article/details/110089783