一、类加载过程
类装载:classLoader加载class文件到内存中,并创建class对象;
链接:(验证、准备、解析)验证内部结构、类变量分配空间且初始化默认值、符号引用替换到直接引用;
初始化:初始化类变量;
http://blog.csdn.net/gjanyanlig/article/details/6818655
二、反射
Class类:用来描述类的内部结构的类。Class对象:包含一个类内部结构信息的对象。
package classLoadAndReflect;
import classLoadAndReflect.MyClassLoader;
import java.lang.Class;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class MyReflect {
public static void main(String[] args) throws Exception {
// 获取类的Class对象,包含类的“结构信息”
Class c1 = Class.forName("classLoadAndReflect.MyClassLoader");
Class c2 = MyClassLoader.class;
Class c3 = (new MyClassLoader()).getClass();
System.out.println(c1.getName());
//通过Class对象创建类的实例
MyClassLoader loader = (MyClassLoader) c1.newInstance();
loader.A(222);
//通过Class对象创建Method对象,利用“主调对象”调用方法
Method method = c1.getMethod("A", int.class);
method.invoke(loader, 11111);
//通过Class对象创建Field对象,设置“对象”成员变量的值
Field field = c1.getDeclaredField("a");
field.setInt(loader, 8888);
//获取方法上的注解信息
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
String description = annotation.getDescribe();
System.out.println(description);
}
}
classLoadAndReflect.MyClassLoader
222
11111
默认注解
三、自定义注解
通过自定义注解,可以在类、方法上添加控制信息。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
public String getDescribe() default "默认注解";
}
@MyAnnotation(getDescribe = "后来添加在方法上的注解")
public void A(int x){
System.out.println(x);
}
//获取方法上的注解信息
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
String description = annotation.getDescribe();
System.out.println(description);
http://gityuan.com/2016/01/23/java-annotation/
http://www.jianshu.com/p/a08e7e9ed765