关于Class和java的反射

本文深入探讨Java反射机制,解析Class对象的作用与反射的优缺点,通过实例演示如何使用反射获取类信息、方法、字段及构造函数,实现类的实例化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class的意义
作为程序运作过程中用于标识和维护某个类运行时候的状态,可以通过反射来获取到相应的对象属性。这个Class和我们常见的class还是有所区别的,前者更多的是保存运行时的类信息,后者则只是一个关键字而已。
反射的理解
反射是一种可以获取jvm里面动态信息的加载方式。反射的优点在于可以动态化地加载类的属性和方法,是java语言中比较灵活的一种特性。但是反射也有他自己的缺点,毕竟需要提前进行编译的代码才能被反射操作,操作效率上会慢于直接操作java程序。

通过class我们最常用的就是反射技巧,可以借助反射来获取类里面我们所需要的变量,方法,构造函数等信息,同时我们还可以借助反射来进行类的实例化操作。

接下来我们闲话不多说,直接写一个demo来进行总结和归纳

import org.junit.Before;
import org.junit.Test;
import 自定义类加载器.User;

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

/**
 * @author idea
 * @data 2019/2/12
 */
public class ReflectTest {

    User user;
    Class userClass;

    @Before
    public void setUp() {
        user = new User("idea", "pwd");
        userClass = user.getClass();
    }


    /**
     * 获取包名和类名
     */
    @Test
    public void getClassAndPackageName() {
        System.out.println(userClass.getName());
    }

    /**
     * 获取单独的类名
     */
    @Test
    public void getClassName() {
        System.out.println(userClass.getSimpleName());
    }

    /**
     * 获取数组名称
     */
    @Test
    public void getComponentName() {
        String[] arr = {"asd", "vbbb"};
        System.out.println(arr.getClass().getComponentType());
    }

    /**
     * 获取方法名称的数组
     */
    @Test
    public void getFieldAndMethods() {
        //获取所有的方法 包括父类信息
        Method[] methods = userClass.getMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }
        //获取所有的属性 包括父类信息
        Field[] fields = userClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
    }


    /**
     * 返回全部构造器数组,无论是public/private还是protected,不包括超类的成员
     */
    @Test
    public void getDeclaredConstructors() {
        Constructor[] constructors = userClass.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getParameterCount());
        }
    }

    /**
     * 获取当前类的修饰符
     */
    @Test
    public void getModifiers() {
        int status = userClass.getModifiers();
        System.out.println(status);
    }

    /**
     * 创建类实例的方式
     *
     * @throws ClassNotFoundException
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     */
  @Test
public void classNewInstance() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
    Class c1 = Class.forName("java.lang.Integer");
    String str = (String) Class.forName("java.lang.String").newInstance();
    Constructor c2 = Class.forName("java.lang.String").getDeclaredConstructor();
    c2.setAccessible(true);
    String st1 = (String) c2.newInstance();
    Constructor c3 = Class.forName("java.lang.String").getDeclaredConstructor(new Class[]{String.class});
    c3.setAccessible(true);
    String str2 = (String) c3.newInstance("idea");
    System.out.println(str2);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值