黑马程序员——枚举以及反射机制

时间:2023-02-18 20:15:16

---------------------- android培训java培训、期待与您交流! ----------------------

 

 

  枚举是重点也是难点,为什么这样说,我觉得重点是因为它很实用,难点是因为涉及到java里面的很多知识点
比如内部内,面向对象等知识点。
  
  如何为枚举定义一个构造方法?
首先你定义的构造方法必须定义在参数列表后,并且一般构造方法的权限是私有的(private)
  SUN(1)  ,  MON(),   TUS , WEN ,  THUR , FRI ,  SAT
  private WeekDay() {
  System.out.println("1");
 }
  private WeekDay(int day ) {
  System.out.println("2");
 }


result:
 2
 1

总结:枚举对象后可以跟上参数,比如上面的 SUN(1) 它就调用第二个方法, MON()它就调用第一个方法
 呵呵,看着看着真的看到了老张讲到了交通灯,交通灯的确用到了枚举实例

二.交通等问题
   
    红灯,绿灯,黄灯三者之间变换
     涉及到的重点还是内部类

import java.util.Date;
public class Enum {

 public static void main(String[] args) {
  new Date(300){};
 }
 
 public enum TrafficLight{
  
  RED(30){
   public  TrafficLight nextlight(){
    return YELLOW;
    
   }
  }
  
  ,GRENN(45){
   public  TrafficLight nextlight(){
    return YELLOW;
   }
   
  },YELLOW(8){
   public  TrafficLight nextlight(){
    return RED;
   }
   
   };
   public  abstract TrafficLight nextlight();
   private int time;
   private  TrafficLight(int time){
    this.time=time;
    
   }
  }
 
}

 

 

  一. 反射的基石——>Class类    反射技术应用于:S S H等框架

  Person p1=new Person ();

  Person p2=new Person();

 得到字节码的三种方式:

(1) Class c1= Date.class;//得到Date类的字节码
 Class c2=Person .class;//得到Person类的字节码

(2) p1.getClass();//得到字节码

(3) Class.forName("java.lang.String");//返回字节码
第三种常用


二.案例

public class Demo {

 
 public static void main(String[] args) throws ClassNotFoundException {
 
  String str="Hello.java";
  Class c1=str.getClass();
  Class c2=String.class;
  Class c3=Class.forName("java.lang.String");
  System.out.println(c1==c2);
  System.out.println(c1==c3);
  System.out.println(int.class==Integer.class);
  System.out.println(int.class==Integer.TYPE);
  System.out.println(int[].class.isPrimitive()); //判断数组类型是不是数组类型
  System.out.println(int[].class.isArray());  //判断数组类型的class实例对象是不是数组
  
 }

}

总结:在源程序出现的类型,都有各自的Class对象实例对象,如int[],void..

  三.反射定义
  我看了视频后老张是这么说的(他采用的一个学员的说法):反射就是把java类中的各个成分映射成各个java相应的类
我自己总结了一下:
  Reflection(反射) 是Java被视为动态(或准动态)语言的一个关键性质。
      这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,
    包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现interfaces(例如Serializable),
    也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods。
   

   四.自己对反射的应用举例
       1. 得到某个对象的属性
 public Object getProperty(Object owner, String fieldName) throws Exception {
 Class ownerClass = owner.getClass();
 
Field field = ownerClass.getField(fieldName);
 
Object property = field.get(owner);
 
return property;
 }
Class ownerClass = owner.getClass():得到该对象的Class。

Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。

Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,
这里会报IllegalAccessException。

    2. 得到某个类的静态属性

 public Object getStaticProperty(String className, String fieldName)
 throws Exception {
 Class ownerClass = Class.forName(className);
 
Field field = ownerClass.getField(fieldName);
 
Object property = field.get(ownerClass);
 
return property;
 }

Class ownerClass = Class.forName(className) :首先得到这个类的Class。

Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。

Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。

    3. 执行某对象的方法

public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
 
Class ownerClass = owner.getClass();
 
Class[] argsClass = new Class[args.length];
 
for (int i = 0, j = args.length; i < j; i++) {
 argsClass[i] = args[i].getClass();
 }
 
Method method = ownerClass.getMethod(methodName, argsClass);
 
return method.invoke(owner, args);
 }
Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。

5~9行:配置参数的Class数组,作为寻找Method的条件。

Method method = ownerClass.getMethod(methodName, argsClass):通过Method名和参数的Class数组得到要执行的Method。

method.invoke(owner, args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。
返回值是Object,也既是该方法的返回值

 

五,反射的作用:——>实现框架功能

 (1)框架与框架要解决的核心问题

  例子:我做房子卖给用户住,有用户自己安装空调,门窗,我做的房子就是框架,
  用户需要使用我的框架,把门窗插入到我的框架中。框架如工具类有区别,工具类被
  用户类调用,而框架是调用用户提供的类。
 
 (2)框架要解决的核心问题

  我在写框架(房子)时,你还在读小学,我写的框架程序怎样调用让你以后写的类(门,窗)呢?


  因为在写程序是无法知道别调用的类名,所以在程序中无法new一个对象的实例了,那么这是就需要
  用反射来做了!

---------------------- android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima