8.12 注解和反射学习笔记

本文详细介绍了Java中的元注解、自定义注解的创建,以及如何获取Class类的实例。深入探讨了类的加载过程,包括静态变量、方法、常量池的加载,以及初始化阶段。同时,讨论了类初始化的触发条件和双亲委派机制,确保类加载的安全性。此外,通过代码示例展示了如何通过反射创建对象、调用方法和操作属性,并对比了反射操作的性能损耗。

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

部分转自秦疆老师课程,加入自己总结

1. 元注解

2. 自定义注解的设置

 其中@interface表示设置注解名以及各参数。

3. 获取Class类的实例方法

只要元素类型与维度一样,它们就是同一个class.hashcode()相同

4. 类的加载过程

1.  类的静态变量、静态方法、常量池、代码等加载到方法区
2.  类加载过程中,生成指向堆的Java.lang.Class对象(加载)
3.  在中设置类变量默认初始值,或者为类变量(static)在方法区中分配内存并设置类变量默认初始值(链接
4.  A类的对象指向方法区A类的数据,并且去找Java.lang.Class对象,执行<clinit>()方法(将静态代码块以及初始值合并) (初始化

 

5. 类发生初始化的条件

 

6. 双亲委派机制

为了安全性,java.lang.String 自己编写跑不起来,因为和根目录的重复,分别从系统加载器扩展加载器引导加载器按顺序查询。

7. 通过反射创建对象,调用方法,操作属性

注意通过反射获得方法时以及.invoke()方法时的参数分别是什么

 

8. 使用反射后的运行速度测试

 

//=======================================================================
/*
输出结果为:
普通方法执行的时间为:5ms
反射方法执行的时间为:2432ms
反射方法开启setAccessible(true)后执行的时间为:1496ms
*/
//=======================================================================

package com.yan.reflection;

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

public class Reflection {

    public static void test01()
    {
        User user = new User();

        long startTime = System.currentTimeMillis();
        for (int i=0; i < 1000000000; i++)
        {
            user.getName();
        }
        long endTime = System.currentTimeMillis();

        System.out.println("普通方法执行的时间为:" + (endTime - startTime) + "ms");
    }

    public static void test02() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        User user = new User();
        Class c1 = user.getClass();

        Method getName = c1.getDeclaredMethod("getName", null);

        long startTime = System.currentTimeMillis();
        for (int i=0; i < 1000000000; i++)
        {
            getName.invoke(user, null);
        }
        long endTime = System.currentTimeMillis();

        System.out.println("反射方法执行的时间为:" + (endTime - startTime) + "ms");
    }

    public static void test03() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        User user = new User();
        Class c1 = user.getClass();

        Method getName = c1.getDeclaredMethod("getName", null);
        getName.setAccessible(true);

        long startTime = System.currentTimeMillis();
        for (int i=0; i < 1000000000; i++)
        {
            getName.invoke(user, null);
        }
        long endTime = System.currentTimeMillis();

        System.out.println("反射方法开启setAccessible(true)后执行的时间为:" + (endTime - startTime) + "ms");
    }

    public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
       test01();
       test02();
       test03();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值