`

Java 枚举、反射等(系列上)

阅读更多

 

@version 1.0  2011.01.10


1,引言

→基础+学习能力

→ide工具开发配置(Eclipse)

   java、javac的jdk版本

→知识面(java ee  IDE  jms  jmx  jndi...)、jdk5/jdk6新特性

2,jdk5新特性要摘

import static 导入一个类中的某个或所有静态方法

(import 导入一个类或包中所有类)

→overload vs override

→可变参数 ...(隐藏数组)

→增加for循环 (实现Iterable接口的集合类)

for(VariableModifiers Type Identifier:Expression)statement

→自动拆装箱autoboxing/unboxing(将对象中的基本数据形态信息从对象中自动取出,隐藏细节)

 说明:http://www.talentdigger.cn/home/space-6-do-blog-id-2368.html

→享元模式(flyweight)

3,枚举 enum

 →说明和应用:http://tech.e800.com.cn/articles/2009/97/1252286198897_1.html

 →eg

           ----------------------------------

        import java.util.Date;

public class EnumTest {

public static void main(String[] args) {

    WeekDay1 weekDay = WeekDay1.MON;

    System.out.println(weekDay.nextDay());


    WeekDay weekDay2 = WeekDay.FRI;

    System.out.println(weekDay2);

    System.out.println(weekDay2.name());

    System.out.println(weekDay2.ordinal());

    System.out.println(WeekDay.valueOf("SUN").toString());

    System.out.println(WeekDay.values().length);

}


public enum WeekDay{

    SUN(1),MON(),TUE,WED,THI,FRI,SAT;

    private WeekDay(){System.out.println("first");} //带有构造函数

    private WeekDay(int day){System.out.println("second");}

}


public enum TrafficLamp{

    RED(30){  //带有抽象方法

        public  TrafficLamp nextLamp(){

            return GREEN;

        }

    },

    GREEN(45){

        public  TrafficLamp nextLamp(){

            return YELLOW;

        }

    },

    YELLOW(5){

        public  TrafficLamp nextLamp(){

            return RED;

        }

    };

    public abstract TrafficLamp nextLamp();

    private int time;

    private TrafficLamp(int time){this.time = time;}

    }

}

→单成员枚举可以作为单例实现方式

5,反射★

→Class类  描述Java程序中的Java类,代表Java类在内存中的字节码

类.class\对象.getClass()\Class.forname("类名")

→数组类型实例对象  Class.isAarry

→反射 把Java中的各种成分映射成相应的Java类

Field、Method、Constructor、Package等

→构造方法反射Constructor

//new String(new StringBuffer("abc")); //需求:反射生成字符串abc

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

String str = (String)constructor.newInstance(/*"abc"*/new StringBuffer("abc"));

System.out.println(str.charAt(2));

→成员变量反射Field

//需求:反射获得成员变量的值

ReflectPoint pt1 = new ReflectPoint(3,5);

Field fieldY = pt1.getClass().getField("y");

//fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值

System.out.println(fieldY.get(pt1));

Field fieldX = pt1.getClass().getDeclaredField("x"); //私有

fieldX.setAccessible(true); //暴力反射

System.out.println(fieldX.get(pt1));

→成员方法反射Method

//TestArguments.main(new String[]{"111","222","333"});//需求:反射调用循环显示数组内容成员方法

String startingClassName = args[0];

Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);

//mainMethod.invoke(null, new Object[]{new String[]{"111","222","333"}});

mainMethod.invoke(null, (Object)new String[]{"111","222","333"});

 

→面向对象的专家模式

→数组反射以及数组与Object的关系

           ----------------------------------

int [] a1 = new int[]{1,2,3};

int [] a2 = new int[4];

int[][] a3 = new int[2][3];

String [] a4 = new String[]{"a","b","c"};

System.out.println(a1.getClass() == a2.getClass());

System.out.println(a1.getClass() == a4.getClass()); //*

System.out.println(a1.getClass() == a3.getClass()); //*

System.out.println(a1.getClass().getName());

System.out.println(a1.getClass().getSuperclass().getName());

System.out.println(a4.getClass().getSuperclass().getName());


Object aObj1 = a1;

Object aObj2 = a4;

//Object[] aObj3 = a1;

Object[] aObj4 = a3;

Object[] aObj5 = a4;

 

System.out.println(a1);

System.out.println(a4);

System.out.println(Arrays.asList(a1));

System.out.println(Arrays.asList(a4));

//打印传入内容

printObject(a4);

printObject("xyz");

private static void printObject(Object obj) {

    Class clazz = obj.getClass();

    if(clazz.isArray()){

        int len = Array.getLength(obj);

        for(int i=0;i<len;i++){

            System.out.println(Array.get(obj, i));

        }

    }else{

        System.out.println(obj);

    }

}

           ----------------------------------

→ArrayList vs HashSet、HashCode分析(哈希算法)

 

→eg HashSet机制和内存泄漏

Collection collections = new HashSet();

ReflectPoint pt1 = new ReflectPoint(3,3);

ReflectPoint pt2 = new ReflectPoint(5,5);

ReflectPoint pt3 = new ReflectPoint(3,3);


collections.add(pt1);

collections.add(pt2);

collections.add(pt3);

collections.add(pt1);


pt1.y = 7;

collections.remove(pt1); //内存泄漏

 

→开发框架原理的理解(反射的应用)

 

 





 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics