但行好事 莫问前程

java反射

陈明羽 2019-09-11

微信搜索“我是树懒”或扫下方二维码关注公众号

优质文章,第一时间送达

在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。

反射中常用的到的类

  1. Class类: 代表类的实体,在运行的Java应用程序中表示类和接口
  2. Field类: 代表类的属性
  3. Method类: 代表类的方法
  4. Constructor类: 代表类的构造方法

Class类

Class对象的由来是将class文件读入内存,并为之创建一个Class对象

Class类表示正在运行的java应用程序中的类和接口,也就是jvm中有N多的实例每个类都有该Class对象,包括基本数据类型

package com.my.concurrent.reflect;

import org.springframework.util.StringUtils;

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

/**
 * @author: chenmingyu
 * @date: 2019/9/17 11:07
 * @description:
 */
public class Reflect {

    private String name;

    private final int age = 25;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private Boolean isMy(String name) {
        if(name.equals("my")){
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

    @Override
    public String toString() {
        return "Reflect{" +
                "name='" + name + '\'' +
                '}';
    }
}

获取class类的三种方式

// 第1种 
Class var = Reflect.class;
System.out.println(var.getName());
// 第2种
Reflect var1 = new Reflect();
Class var2 =var1.getClass();
System.out.println(var2.getName());
// 第3种 常用
Class var3 = Class.forName("com.my.concurrent.reflect.Reflect");
System.out.println(var3.getName());

使用Class类创建实例

Class reflectClass = Class.forName("com.my.concurrent.reflect.Reflect");
Reflect reflect = (Reflect)reflectClass.newInstance();
reflect.setName("my");
System.out.println(reflect.toString());

Class 没有公共构造方法。Class对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了

Field类

访问私有的属性

Class reflectClass = Class.forName("com.my.concurrent.reflect.Reflect");
Field ageField = reflectClass.getDeclaredField("age");
ageField.setAccessible(Boolean.TRUE);
int age = (int) ageField.get(reflect);
System.out.println(age);

Method类

执行私有方法

Class reflectClass = Class.forName("com.my.concurrent.reflect.Reflect");
Method method = reflectClass.getDeclaredMethod("isMy", String.class);
method.setAccessible(Boolean.TRUE);
Boolean result= (Boolean) method.invoke(reflect,"xn");
System.out.println(result);

Constructor类

通过Constructor类创建对象实例

Class reflectClass = Class.forName("com.my.concurrent.reflect.Reflect");
Constructor constructor = reflectClass.getConstructor();
Reflect constructorReflect = (Reflect) constructor.newInstance();
constructorReflect.setName("xn");
System.out.println(constructorReflect.toString());

在获取私有属性或者方法的时候要用方法中带有Declared的方法,这类方法可以反射到私有的方法和属性,没有Declared的只能用来反射公有的方法和属性

Tags: 反射
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章