2、元注解
- 元注解负责注解其他注解,java定义了4个标准的meta-annotation类型,被用来提供对其他annotation类型作说明、
@Target
描述注解的使用范围,可传递一个数组@Rentention
描述注解的有效范围@Documented
表示是否将注解生产在javadoc文件中@Inherited
表示子类可以继承父类的注解
3、 自定义注解
@interface
// 注解的参数:参数类型+参数名()
public class TestAnnotations {
@Myannotation(age=19)
public void test(){}
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface Myannotation{
// 注解参数:类型+参数名()
String name();
int age();
// 默认值
String name()default "";
}
3、反射机制
- 加载完类之后,在堆内存的方法区产生一个Class类型的对象(一个类只有一个Class对象),
这个对象包含了完整的类的结构信息
。通过这个对象看到类的结构。
// 正常方式
引入需要的”包类“名称—— new实例化——取得实例化对象
// 反射
实例化对象——getClass()方法——得到完整的”包类“名称
`一个类在内存中只有一个Class对象`
public class TestClass {
public static void main(String[] args) throws ClassNotFoundException {
// 通过反射获得Class对象
Class c1 = Class.forName("demo.User");
Class c2 = Class.forName("demo.User");
System.out.println(c1);
// hashCode相等
// 一个类只有一个Class对象
// 一个类被加载后,类的整个结构都封装在Class对象中
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
}
}
class User{
int age;
int sex;
String name;
}
3、获得Class方式
public class TestClass {
public static void main(String[] args) throws ClassNotFoundException {
User user =new User();
System.out.println(user.name);
// 方式一:通过对象获得
Class c1=user.getClass();
System.out.println(c1.hashCode());
//方式2:Class.forName()
Class c2 = Class.forName("demo.User");
System.out.println(c2.hashCode());
// 方式3:通过类名.class获得
Class c3 = User.class;
System.out.println(c3.hashCode());
// 方式4:内置基本数据类型的包装类都有一个TYPE属性
Class c4 = Integer.TYPE;
System.out.println(c4.hashCode());
// 获得父类类型
Class c5 = c1.getSuperclass();
System.out.println(c5);
}
}
4、哪些类型有Class对象?
- Class:外部类、成员、局部内部类、匿名内部类
- [ ]数组
- enum
- annotation :注解@interface
- primitive type:基本数据类型
- void
5、java内存分析
栈
后进先出
- 存放基本变量类型(包含具体值)
- 引用对象的变量(存放这个引用在堆里的具体地址)
堆
不连续的空间、new
- 存放new的对象和数组(类的实例)
- 可以被所有线程共享,不会存在其他的对象引用
方法区
在堆空间内,用于存放代码、静态变量和方法、常量池
- 可以被所有线程共享
- 包含多有的class和static变量
Student stu = new Student();