注解(Annotation)和反射(Reflection)

注解作用

1、可对程序作出解释,类似注释;
2、可被其他程序(编译器)读取;

注解格式

@注释名,可添加参数:@SuppressWarnings(value=“unchecked”)

内置注解

1、@Override:只适用修辞方法,表示一个方法声明打算重写超类中的另一个方法声明;
2、@Deprecated:可修饰方法、属性、类,表示不鼓励程序员适用这样的元素;
3、@SuppressWarning:用来抑制编译时的警告信息,需要添加参数(“all”、“unchecked”、“deprecation”);

元注解(负责注解其他注解)

1、@Target:描述注解的使用范围;
2、@Retention:表示需要在声明级别保存该注释的信息,用于描述注解的生命周期(SOURCE < CLASS < RUNTIME)
3、@Document:说明该注解将被包含在javadoc中;
4、@Inherited:说明子类可以继承父类中的注解;

自定义注解

使用@interface自定义,自动继承Annotation接口;
注解的参数:参数类型 + 参数名();

反射作用

反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
正常方式:引入需要的“包类”名称->通过new实例化->取得实例化对象
反射方式:实例化对象->getClass()方法->得到完整的“包类”名称

//通过反射获取类的class对象
Class c1 = Class.forName("com.kuang.reflection.User");

//一个类在内存中只有一个Class对象
//一个类被加载后,类的整个机构都会被封装在Class对象中

Class类的创建方式:
1. 通过对象获得:Class c1 = person.getClass();
2. 通过forname获得:Class c2 = Class.forName(“com.kuang.reflection.Student”);
3. 通过类名.class获得:Class s3 = Student.class;
4. 基本内置类型的包装类都有一个Type属性:Class s4 = Integer.TYPE;

类加载到内存过程:
1、加载到内存,产生一个类对应的Class对象;
2、链接,将.class代码合并到JVM的运行状态中;
3、初始化,执行类构造器< clinit >() 方法,有编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。若发现其父类没有进行初始化,则需要先触发其父类的初始化;

获得类的信息:
1、获得类的名字:
c1.getName() //获得包名 + 类名
c1.getSimpleName() //获得类名
2、获得类的属性,可获得指定属性:
c1.getFields() //只能找到public属性
c1.getDeclaredFields() //找到全部属性
3、获得类的方法:
c1.getMethods() //获得本类及其父类的全部public方法
c1.getDeclaredMethods() //获得本类的所有方法

       Class c1 = Class.forName("User");
       System.out.println(c1);

       //构造一个对象
       User user1 = (User)c1.newInstance();//本质调用类的无参构造器
       System.out.println(user1);

       //通过构造器创建对象
       Constructor constructor = c1.getDeclaredConstructor(int.class, String.class);
       User user2 = (User)constructor.newInstance(18, "mei");
       System.out.println(user2);

       //通过反射调用普通方法
       User user3 = (User)c1.newInstance();

       //通过反射获取一个方法
       Method setName = c1.getDeclaredMethod("setName", String.class);
       //invoke:激活
       //(对象,“方法的值”)
       setName.invoke(user3, "kuangsheng");
       System.out.println(user3.getName());

       //通过反射操作属性
       User user4 = (User)c1.newInstance();
       Field name = c1.getDeclaredField("name");
       name.setAccessible(true); //不能直接操作私有属性,需要关闭程序的安全检测
       name.set(user4, "kuangsheng2");
       System.out.println(user4.getName());
上一篇:DesignPatternOberver观察者模式


下一篇:简说设计模式——观察者模式