黑马程序员 --- 枚举与反射

来源:互联网 发布:网络鉴宝是骗局吗 编辑:程序博客网 时间:2024/05/21 10:39

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


一、枚举

1、          用普通类如何实现枚举功能,定义一个Weekday类,模拟枚举功能。

(1)定义一个私有构造函数。

(2)每一个类分别用一个公有的静态成员变量来表示。

(3)可以有若干公有方法或抽象方法.

2、          枚举中定义其他成员都必须位于定义好的元素之后。

3、          枚举中定义的构造方法必须都是私有的。

4、          枚举只有一个成员时,就可以作为一种单例的实现方式。

例、枚举小程序。public class EnumTest {       public static void main(String[] args)      {      System.out.println(weekday.name());    //获取名称。      System.out.println(weekday.ordinal());   //获取对象的位置。       //将一个字符串变成对应的枚举对象。      System.out.println(weekday.valueOf("SUN").toString());      //获取所有枚举元素的数组(将枚举元素转换为一个数组,可以对数组操作)      System.out.println(weekday.values().length);       }         public enum WeekDay //定义一个枚举类 {             SUN(1),MON;   //定义枚举中的成员。       private WeekDay()       {               System.out.println("first");        }      private WeekDay(int day)      {              System.out.println("second");      } }

二、反射



1、 Class代表一类什么样的事物? 代表Java类。


2、如何得到各个类的字节码文件。( Class类型)


    (1)类名.class,例如,System.class


    (2)对象.getClass(),例如,new Date().getClass()


          (3) Class.forName("类名"),例如,Class.forName("java.util.Date");


 


3、          Class.forName(“java.lang.String”):返回刚才加载进来的那个字节码。


作用:返回字节码,返回的方式有两种:


(1)第一种是这份字节码曾经被加载过,在java虚拟机中,可以直接被返回。


(2)Java虚拟机中还没有这份字节码,则用类加载器去加载,把加载进来的字节码缓存进java虚拟机里,以后得到这个字节码就不需要再加载了。


4、          数组类型的Class实例对象。Class.isArray()


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


5、          反射就是把java类中的各种成分映射成相应的java类。


6、          Constructor类代表某个类中的一个构造方法。


得到某个类所有的构造方法:例子:Constructor[] constructors = Class.forName(“java.lang.String”).getConstructors();


7、   // new String(new StringBuffer(“abc”));


           Constructor  constructor1= String.class.getConstructor(StringBuffer.class);


           String str = (String)constructor1.newInstance(new StringBuffer(“abc”));


          //这里边出现两个StringBuffer,第一个StringBuffer是表示选择哪个构造方法,第二个StringBuffer表示用这个构造方法的时候还需传一个StringBuffer类型的对象。


8、          Class.newInstance()方法:


          例子:String obj = (String)Class.forName(“java.lang.String”).newInstance();


        该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。


9、          Method类代表某个类中的一个成员方法。


得到类中的某一个方法:


Method charAt = Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);


 如果传递给Method对象的invoke()方法的第一个参数为null,说明该Method对象对应的是一个静态方法。例、将一个类中的字段上的某个字符按指定字符进行替换。


import java.lang.reflect.Field;
   public class ReflectTest3 {
 
   public static void main(String[] args)throws Exception {
     Test t = new Test(3,5);  //创建Test类对象。
     changeStringValue(t);  //调用changeStringValue()方法。
     System.out.println(t);  
 }
    private static void changeStringValue(Object obj) throws Exception
    {
         Field[] fields = obj.getClass().getFields(); //获取这份字节码的所有字段。
         //将这些字段进行迭代。
         for(Field field : fields)
         {
            if(field.getType() == String.class) //判断字段的类型。因为是一份字节码文件,所以用等号比较。
            {
                  String oldvalue = (String)field.get(obj); //取出对象上的变量值。


               //调用replace()方法,将字段中的字符‘b’替换为字符‘a’.
                  String newvalue = oldvalue.replace('b','a'); 


               field.set(obj, newvalue);//对obj对象上的字段进行设值。
            } 
          }
      }
}


class Test
  {
     private int x;
     public int y;
     public String str1 = "ball";
     public String str2 = "basketball";
     public String str3 = "itcast";
 public Test(int x, int y) 
 {
    super();
    this.x = x;
    this.y = y;
 } 
 public String toString()
 {
      return str1+":"+str2+":"+str3;
 } 
 public int getX() 
{
     return x;
 }
 public void setX(int x) {
     this.x = x;
 }
 public int getY() {
     return y;
 }
 public void setY(int y) {
    this.y = y;
  }
}
 




0 0
原创粉丝点击