负责注解其它注解
@Target({ElementType.METHOD, ElementType.TYPE})//mehtod:方法上有效,type:类上有效
@Inherited//子类可以继承父类中的注解
@Retention(RetentionPolicy.RUNTIME)//Retention 表示注解在什么时候才有效,runtime(运行时)>class(class文件)>source(源码)
@Documented//Documentd 表示是否将我们的注解生成在java doc中
public @interface MyAnnotation {
//参数类型+参数名()
String name() default "";
int age() default 0;
int id() default -1;//如果默认值为-1,代表不存在
String[] schools() default {"清华", "北大"};
}
class Test {
@MyAnnotation(age = 18, name = "zs")//参数不考虑顺序
public void test() {
}
}
允许程序在执行期借助Reflection api取得任何类的内部信息,并能操作任意对象的内部属性及方法
Class cla=类.class
对象.getClass()
Class.forName(全限定类名)
执行类构造器clinit方法,收集类中所有类变量赋值动作和静态代码块中的语句合并起来(类构造器是构造类信息)
父类没有初始化就先初始化父类
类的主动引用:会发生类的初始化
类的被动引用,不会发生类的初始化
虚拟机会保证一个类的clinit方法在多线程环境中被正确加锁和同步
自定义类加载器->系统类加载器->扩展类加载器->根加载器(c/c++)->
//1.系统类加载器
ClassLoader sysCl=ClassLoader.getSystemClassLoader();
//2.系统类加载器的父类->扩展类加载器
ClassLoader parent=sysCl.getParent();
//3.扩展类加载器的父类->根加载器(引导类加载器)
ClassLoader parent1=parent.getParent();//c/c++开发,无法获得,null
//系统类加载可以加载的路径:
System.getProperty("java.class.path");
原文:https://www.cnblogs.com/jpymll/p/14329829.html