枚举类&&注解&&反射

  • 2019 年 10 月 6 日
  • 筆記

什么是枚举类?

枚举类是优化定义固定对象的一种特殊的类。

换句话说,在需要类的实例为一个或者多个并且相对固定的时候,使用枚举类。(枚举类可扩展)

类的实例相对来说固定的有日期,客观不变的一些数字等等。

enum WorkDay  {      MONDAY, THUEDAY, WEDNESDAY , THURSDAY , FRIDAY;  }      public class Main {        public static void main(String[] args) {          System.out.println("Hello World!");            WorkDay workDay;            workDay=WorkDay.MONDAY;   //WorkDay实例化的workday值限定在周一到周五之间    //      workDay=3;     //编译报错            WorkDay []workDays = WorkDay.values();  //返回枚举类型的对象数组            for(int i =0;i<workDays.length;i++)          {              System.out.println(workDays[i]);          }                /**           * 单例模式是枚举类的特例,单例模式的要求是一个类只能由一个实例对象。           * 枚举类的使用是定义类时固定其一个或多个对象           *           * 枚举类的特点:           *  - 类型安全(枚举类的定义就是固定的)           *  - 枚举类的对象自动添加private static final           *  - 某种程度的解耦,枚举类可以加一组常量或者对象抽离出主程序,减小类之间的耦合性。在枚举类模板的扩展上也更加容易           */        }  }

注解

Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加 载, 运行时被读取, 并执行相应的处理。

注解本质是一个接口和一组键值对,通过反射和代理实现某种行为。

【框架 = 注解 + 反射 + 设计模式。】

/**   * @author shkstart   * @version 1.0   *   */  public class Main {      /**       * 程序的主方法,程序的入口       * @param args String[] 命令行参数       */        @SuppressWarnings("unused")  //抑制编译器警告      int a = 10;        @Deprecated     //用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择      public void print(){          System.out.println("过时的方法");      }      @Override       //限定重写父类方法, 该注解只能用于方法      public String toString() {          return "重写的toString方法()"; }      public static void main(String[] args) {      }      /**       * 求圆面积的方法       * @param radius double 半径值       * @return double 圆的面积       */      public static double getArea(double radius){          return Math.PI * radius * radius; }  }

反射

什么是反射?

反射机制允许程序在运行期 借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。 (最高权限)

Object类

package java.lang;    public class Object {       private static native void registerNatives();      static {          registerNatives();      }          public final native Class<?> getClass();        public native int hashCode();        public boolean equals(Object obj) {          return (this == obj);      }        protected native Object clone() throws CloneNotSupportedException;          public String toString() {          return getClass().getName() + "@" + Integer.toHexString(hashCode());      }          public final native void notify();          public final native void notifyAll();          public final native void wait(long timeout) throws InterruptedException;          public final void wait(long timeout, int nanos) throws InterruptedException {          if (timeout < 0) {              throw new IllegalArgumentException("timeout value is negative");          }            if (nanos < 0 || nanos > 999999) {              throw new IllegalArgumentException(                                  "nanosecond timeout value out of range");          }            if (nanos > 0) {              timeout++;          }            wait(timeout);      }            public final void wait() throws InterruptedException {          wait(0);      }          protected void finalize() throws Throwable { }  }

其中有一个这样的方法

public final native Class<?> getClass();

获取Class类的实例

  • 若已知具体的类,通过类的class属性获取,该方法最为安全可靠, 程序性能最高
  • 已知某个类的实例,调用该实例的getClass()方法获取Class对象
  • 已知一个类的全类名,且该类在类路径下,可通过Class类的静态方 法forName()获取,可能抛出ClassNotFoundException Class test = String.class; Class test01 = "Hello World!".getClass(); Class test02 = Class.forName("java.lang.String"); //抛异常

所有的类都继承Object,所以String.class返回类的实例。

Class类里有一个forName的方法,返回值也为Class:

获取类的信息,调用类的属性及方法

package test;    import java.lang.reflect.Field;  import java.lang.reflect.Method;    class Work {      private String name;      private Integer age;      private String gender;      private String job;        public String getName() {          return name;      }        public void setName(String name) {          this.name = name;      }        public Integer getAge() {          return age;      }        public void setAge(Integer age) {          this.age = age;      }        public String getGender() {          return gender;      }        public void setGender(String gender) {          this.gender = gender;      }        public String getJob() {          return job;      }        public void setJob(String job) {          this.job = job;      }        @Override      public String toString() {          return "Work{" +                  "name='" + name + ''' +                  ", age=" + age +                  ", gender='" + gender + ''' +                  ", job='" + job + ''' +                  '}';      }  }      public class ReflectWork  {        public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {              Class classWork = Class.forName("test.Work");              System.out.println(" ///获取所有方法信息"          );              Method []methods= classWork.getDeclaredMethods();            for (Method m:methods) {              System.out.println(m.toString());            }            System.out.println("  //获取所有成员属性信息");            Field[] field=classWork.getDeclaredFields();          for(Field f:field){              System.out.println(f.toString());                f.setAccessible(true);  //取消类的私有属性的访问权限控制                System.out.println(f.getName().toString());          }              System.out.println("//通过反射初始化");          Work reflectWork = (Work) classWork.newInstance();          reflectWork.setAge(22);          reflectWork.setJob("Dev");          Work work = reflectWork;            System.out.println(work);          }  }