部分转自秦疆老师课程,加入自己总结
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();
}
}