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

原创 2013年12月06日 01:41:22

---------------------- 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培训、期待与您交流! ----------------------

相关文章推荐

黑马程序员_Java高新技术(静态导入、可变参数、增强for循环、自动拆装箱、枚举、反射)

1.静态导入。 import语句可以导入一个类或者某个包中的所有类。 import static 语句导入一个类中的某个静态方法或者所有静态方法。 StaticImport.java   2...

黑马程序员————java中类的加载、反射、动态代理、枚举

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 类的加载、反射、动态代理、枚举 一.类的加载 当程序要使用某个类时,如果该...
  • lgplf
  • lgplf
  • 2015年06月19日 22:23
  • 532

黑马程序员_java高新枚举与反射

----------------android培训、java培训、期待与您交流! ---------------- 一.枚举是Java SE5.0以后才有的类型,下面通过一个实例来说明其中的用法...
  • guyp610
  • guyp610
  • 2012年11月24日 09:38
  • 440

黑马程序员-->11_反射和枚举(Reflect & Enum)

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

黑马程序员--java高新技术 25--枚举,反射

---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------   /*1.5 新特性总结: ...

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

---------------------- android培训、java培训、期待与您交流! ----------------------       枚举是重点也是难点,为什么这样说,我...

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

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

黑马程序员________Java高新技术之反射机制及枚举注释

------- android培训、java培训、期待与您交流! ----------         枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个否则,编译器就会报错...

黑马程序员_王康 java反射,枚举,注解

1) 要想使用反射,首先需要获得待处理类或对象所对应的Class对象 2) 获取某个类或某个对象所对应的Class对象的常用的3种方式:  1.使用Class类的静态方法forName:C...

高新技术--枚举、反射、注解、类加载器、内省

枚举
  • hi2hcs
  • hi2hcs
  • 2014年10月26日 00:10
  • 362
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员---枚举与反射
举报原因:
原因补充:

(最多只允许输入30个字)