枚举、反射

枚举

枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,都是静态常量
当变量的取值有限且固定时,可以使用枚举

可以有若干公有方法或抽象方法。
枚举中的其他成分必须放在枚举元素之后定义,并以分号隔开
构造方法必须为私有
在元素后面加括号并添加参数看列表来标示所使用的构造函数
采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
枚举中有抽象类时,在定义元素时必须有实现了抽象方法的匿名子类来创建

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

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

反射------------基于Class类--描述Java类的Java类

Field----成员变量、Method---方法、Constructor---构造函数

l反射就是把Java类中的各种成分映射成相应的java类

l 如何得到各个字节码对应的实例对象( Class类型)
Ø类名.class,例如,System.class
Ø对象.getClass(),例如,new Date().getClass()
ØClass.forName("类名"),例如,Class.forName("java.util.Date");


Constructor---构造函数

可以通过Class的getConstructor()函数来获得类的构造函数,传入的参数列表为相应的构造函数的参数列表
 Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
可以通过Constructor的newInstance()来创建类的相应实例
 String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));


还可以用Class类的newInstance()函数来创建对象,不过这个函数只能调用相应类的默认构造函数创建实例



Field----成员变量


        Field fieldY = pt1.getClass().getField("y");
        fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值
       通过Field类的get()方法来访问具体对象的变量,参数为具体的对象
        fieldY.get(pt1);
        当类的变量为私有时,不能用getField()函数来取,可以用getDeclaredField()函数来取
        Field fieldX = pt1.getClass().getDeclaredField("x");
        即使取到了私有变量,也还是不能访问,需要用Field类的setAccessible(true)函数将变量设为课访问的
        fieldX.setAccessible(true);
        fieldX.get(pt1);
        Field的set()函数可以给对象上相应的变量赋值
        fieldY.set(pt1,4);



Method---方法

            Methon代表类的一个成员方法
    
            通过Class类的getMethon()函数可以获得类的相应方法,参数为方法名和方法所需的参数类型
        Method methodCharAt = String.class.getMethod("charAt", int.class);
       通过调用Method的invoke()函数来让某一对象执行Method对应的方法,参数为要执行的对象和方法所需的参数
        methodCharAt.invoke(str1, 1);
        如果invoke()函数中表示对象的参数为空,说明Method对应的方法为静态方法
        methodCharAt.invoke(null, 1);



数组的反射

具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象(此处比较与值无关)。



反射的主要作用-------实现框架

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值