Java-注解和反射 内置注解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import java.util.ArrayList;import java.util.List;public class Test01 extends Object { @Override public String toString () { return super .toString(); } @Deprecated public static void test () { System.out.println("Deprecated" ); } @SuppressWarnings("all") public void test02 () { List list = new ArrayList (); } public static void main (String[] args) { test(); } }
元注解
Java里有四个元注解,重点放在Target和Retention上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 package annotations;import java.lang.annotation.*;@MyAnnotation public class Test02 { @MyAnnotation public void test () { } } @Target(value= {ElementType.METHOD,ElementType.TYPE}) @Retention(value = RetentionPolicy.RUNTIME) @Documented @Inherited @interface MyAnnotation{ }
自定义注解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 package annotations;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;public class Test03 { @MyAnnotation2(name = "门酱",schools = {"河北工业大学"}) public void test () { } @MyAnnotation2(schools = {"河北工业大学"}) public void test2 () { } @MyAnnotation3("门酱") public void test3 () { } } @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation2{ String name () default "" ; int age () default 0 ; int id () default -1 ; String[] schools(); } @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation3{ String value () ; }
反射机制 Java不是动态语言(动态语言即可以在运行时代码根据某些条件改变自身结构),但因为反射机制,可以称之为准动态语言。这使得Java编程时更加灵活,但是风险也提升。
获得反射对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 package reflection;public class Test02 { public static void main (String[] args) throws ClassNotFoundException { Class<?> c1 = Class.forName("reflection.User" ); System.out.println(c1); Class<?> c2 = Class.forName("reflection.User" ); Class<?> c3 = Class.forName("reflection.User" ); Class<?> c4 = Class.forName("reflection.User" ); System.out.println(c2.hashCode()); System.out.println(c3.hashCode()); System.out.println(c4.hashCode()); } } class User { private String name; private int id; private int age; public String getName () { return name; } public void setName (String name) { this .name = name; } public int getId () { return id; } public void setId (int id) { this .id = id; } public int getAge () { return age; } public void setAge (int age) { this .age = age; } }
运行结果
1 2 3 4 class reflection .User1915910607 1915910607 1915910607
得到Class类的几种方式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 package reflection;public class Test03 { public static void main (String[] args) throws ClassNotFoundException { Person person = new Student (); System.out.println("这个人是:" +person.name); Class c1 = person.getClass(); System.out.println(c1.hashCode()); Class c2 = Class.forName("reflection.Student" ); System.out.println(c2.hashCode()); Class c3 = Student.class; System.out.println(c3.hashCode()); Class c4 = Integer.TYPE; System.out.println(c4); Class c5 = c1.getSuperclass(); System.out.println(c5); } } class Person { public String name; public Person () { } public Person (String name) { this .name = name; } @Override public String toString () { return "Person{" + "name='" + name + '\'' + '}' ; } } class Student extends Person { public Student () { this .name = "学生" ; } } class Teacher extends Person { public Teacher () { this .name = "老师" ; } }
运行结果
1 2 3 4 5 6 这个人是:学生 284720968 284720968 284720968 int class reflection .Person
所有类型的Class对象
class:外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类
interface:接口
[]:数组
enum:枚举
annotation:注解@interface
primitive type:基本数据类型
void
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package reflection;import javax.swing.text.Element;import java.lang.annotation.ElementType;public class Test04 { public static void main (String[] args) { Class c1 = Object.class; Class c2 = Comparable.class; Class c3 = String[].class; Class c4 = int [][].class; Class c5 = Override.class; Class c6= ElementType.class; Class c7 = Integer.class; Class c8 = void .class; Class c9 = Class.class; System.out.println(c1); System.out.println(c2); System.out.println(c3); System.out.println(c4); System.out.println(c5); System.out.println(c6); System.out.println(c7); System.out.println(c8); System.out.println(c9); int [] a = new int [10 ]; int [] b = new int [100 ]; System.out.println(a.getClass().hashCode()); System.out.println(b.getClass().hashCode()); } }
运行结果
1 2 3 4 5 6 7 8 9 class java .lang.Objectinterface java .lang.Comparableclass [Ljava.lang.String; class [[I interface java .lang.Overrideclass java .lang.annotation.ElementTypeclass java .lang.Integervoid class java .lang.Class
类加载内存分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class Test05 { public static void main (String[] args) { A a = new A (); System.out.println(A.m); } } class A { static { System.out.println("A类静态代码块初始化" ); m=300 ; } static int m = 100 ; public A () { System.out.println("A类的无参构造初始化" ); } }
运行结果
1 2 3 A类静态代码块初始化 A类的无参构造初始化 100
注意修改static int m =100; 放到static代码块前面,m最终是300
分析类初始化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 package reflection;public class Test06 { static { System.out.println("Main类被加载" ); } public static void main (String[] args) throws ClassNotFoundException { System.out.println(Son.M); } } class Father { static int b = 2 ; static { System.out.println("父类被加载" ); } } class Son extends Father { static { System.out.println("子类被加载" ); m = 300 ; } static int m = 100 ; static final int M=1 ; }