Java反射总结

文章详细阐述了Java中的类加载过程,包括加载器的层次结构,如BootstrapClassLoader、ExtClassLoader和AppClassLoader。同时,介绍了反射的概念,包括获取Class对象的三种方式以及如何通过反射访问和使用构造方法、成员变量和成员方法。文中还提供了两个反射的实战例子,一个是绕过泛型检查添加对象到ArrayList,另一个是动态调用指定类的指定方法。
摘要由CSDN通过智能技术生成

类加载器

类的声明周期是加载、验证、准备、解析、初始化、使用、卸载。类的加载过程是加载、连接(验证、准备、解析)、初始化。
类加载器的分类是引导类加载器BootstrapClassLoader、扩展类加载器ExtClassLoader、系统类加载器AppClassLoader。
AppClassLoader的父类是ExtClassLoader,ExtClassLoader的父类是BootstrapClassLoader。
加载自定义类的流程。AppClassLoader类加载器会先检查它的缓存,若有则已被加载,若没有则上交给ExtClassLoader加载器,
同理若有则已被加载若没有则上交给BootstrapClassLoader若有则已加载,若没有则查看它负责的目录中尝试加载,
若加载失败则下交给ExtClassLoader加载器,以此直到下交直到AppClassLoader类加载器从他负责的classpath尝试加载,加载完成。

反射

获取Class类对象的三种方式

类名.Class、对象名.getClass()、Class.forName()。

反射获取构造方法并使用

Class类获取狗砸方法

Constructor<?>[] getConstructors() 返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?>... parameterTypes) 返回单个公共构造方法对象(括号里面是参数)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回单个构造方法对象(括号里面是参数)

用于创建爱你对象的方法

T newInstance(Object... initargs) 根据指定的构造方法创建对象(括号里面是实参)

反射获取成员变量并使用

Class类获取成员变量对象的方法

Field[] getFields() 返回所有公共成员变量对象的数组
Field[] getDeclaredFields() 返回所有成员变量对象的数组
Field getField(String name) 返回单个公共成员变量对象
Field getDeclaredField(String name) 返回单个成员变量对象
void set(Object obj, Object value) 给obj对象的成员变量赋值为value

反射获取成员方法并使用

Class类获取成员方法对象的方法

Method[] getMethods() 返回所有公共成员方法对象的数组,包括继承
Method[] getDeclaredMethods() 返回所有成员方法对象的数组,不包括继承
Method getMethod(String name, Class<?>... parameterTypes) 返回单个公共成员方法对象。例如(int.class, String.class)
Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回单个成员方法
Object invoke(Object obj, Object... args) 调用obj对象的成员方法,参数是args,返回值是Object类型

反射的综合案例

越过泛型检查

public class ReflectTest01 {
    public static void main(String[] args) throws Exception {
        //创建集合
        ArrayList<Integer> array = new ArrayList<Integer>();

//        array.add(10);
//        array.add(20);
//        array.add("hello");

        Class<? extends ArrayList> c = array.getClass();
        Method m = c.getMethod("add", Object.class);

        m.invoke(array,"hello");
        m.invoke(array,"world");
        m.invoke(array,"java");

        System.out.println(array);
    }
}

反射指定类的指定方法

public class ReflectTest02 {
    public static void main(String[] args) throws Exception {
        //加载数据
        Properties prop = new Properties();
        FileReader fr = new FileReader("myReflect\\class.txt");
        prop.load(fr);
        fr.close();

        /*
            className=com.itfxp_06.Student
            methodName=study
         */
        String className = prop.getProperty("className");
        String methodName = prop.getProperty("methodName");

        //通过反射来使用
        Class<?> c = Class.forName(className);//com.itfxp_06.Student

        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();

        Method m = c.getMethod(methodName);//study
        m.invoke(obj);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值