关闭

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

270人阅读 评论(0) 收藏 举报

---------------------- 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;
  }
}
 



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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11014次
    • 积分:365
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档