获取字节码文件的相关内容

反射机制是指在运行状态中,对任意一个类(class文件),都能知道这个类的所有属性和方法;对任意一个对象,都能调用这个对象的方法和属性。这种动态的获取信息和动态的调用对象的方法的功能称为——Java语言的反射机制。

简单点说,动态的获取类中的信息,这就是Java的反射机制。

在Java的反射机制中,我们可以通过配置文件信息,然后通过类名来获取类中包含的详细信息,如构造函数、成员变量和成员函数等。在接下来,作者将分别演示如何通过类名来获取类中包含的信息。

一、获取字节码文件的构造函数

import java.lang.reflect.Constructor;

public class GetClassConstructor {
    public static void main(String[] args) throws Exception {
        createNewObject_2();
    }

    public static void createNewObject_2() throws Exception {
        /**
         *  当获取指定名称对应类中的所体现的对象时,而且该对象的初始化不适用空参的构造函数
         *  可以先通过该类的字节码文件对象,获取空参的构造函数
         *  该方法为:getConstructor(parameterTypes)
         */

    // 包名一定要写全,否则会报"java.lang.ClassNotFoundException"异常
    String name = "src.Person";
        // 找寻该名称类文件,并加进内存,产生Class对象
        Class clazz = Class.forName(name);
        // 获取指定的构造函数对象
        Constructor constructor = clazz.getConstructor(String.class, int.class);
        // 通过该构造器对象的newInstance进行对象的初始化
        constructor.newInstance("小明", 12);
    }

    public static void createNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        String name = "src.Person";
        // 找寻该名称类文件,并加进内存,产生Class对象
        Class clazz = Class.forName(name);
        // 产生该类的实例对象(空参)
        Object obj = clazz.newInstance();
    }
}

二、获取字节码文件的成员变量

import java.lang.reflect.Field;

public class GetClassField {
    public static void main(String[] args) throws Exception {
        getField();
    }

    /**
     * 获取字节码文件中的成员变量
     */
    public static void getField() throws Exception {
        Class clazz = Class.forName("src.Person");
        Field field = null;

        // 获取本类字段,包含私有
        field = clazz.getDeclaredField("age");

        // 对私有字段的访问取消权限检查,可称之为暴力访问
        field.setAccessible(true);

        Object obj = clazz.newInstance();

        field.set(obj, Integer.valueOf(89));

        Object o = field.get(obj);
        System.out.println(o);
    }
}

三、获取字节码文件的成员函数

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

public class GetClassMethod {
    public static void main(String[] args) throws Exception {
        getMethod_3();
    }

    public static void getMethod_3() throws Exception {
        Class clazz = Class.forName("src.Person");
        Method method = clazz.getMethod("walkInfo", new Class[]{String.class, Integer.TYPE});
        Object obj = clazz.newInstance();
        method.invoke(obj, new Object[]{"小强", Integer.valueOf(20)});
    }

    public static void getMethod_2() throws Exception {
        Class clazz = Class.forName("src.Person");

        // 获取空参数的方法
        Method method = clazz.getMethod("show", (Class[]) null);
        Constructor constructor = clazz.getConstructor(new Class[]{String.class, Integer.TYPE});
        Object obj = constructor.newInstance(new Object[]{"小明", Integer.valueOf(12)});
        method.invoke(obj, (Object[]) null);
    }

    /**
     * 获取指定Class中的公有函数
     */
    public static void getMethod() throws Exception {
        Class clazz = Class.forName("src.Person");

        // 获取的都是类中的公有方法
        Method[] methods = clazz.getMethods();

        // 获取本类中的所有方法
        methods = clazz.getDeclaredMethods();
        Method[] var5 = methods;
        int var4 = methods.length;

        for (int var3 = 0; var3 < var4; ++var3) {
            Method method = var5[var3];
            System.out.println(method);
        }
    }
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值