枚举和反射

一、枚举

    枚举本质上是个类,一个所能创建的对象已经确定了的特殊的类。

    举个例子

class Grade{
    private Grade(String str){
        this.value = str;
    }
    public String value;
    public String getValue(){
        return this.value;
    }
    public static final Grade A = new Grade("90-100");
    public static final Grade B = new Grade("80-89");
}
enum Grade{
    A("90-100"),B("80-89");
    public String value;
    private Grade(String str){
        this.value = str;
    }

    public String getValue() {
        return this.value;
    }
}

这两段代码实现的功能是一样的,都是定义了一个枚举类,有A,B两个枚举对象,每个枚举对象有一个value值。

带抽象方法的枚举:

    枚举类中有抽象方法,可以在定义枚举对象的地方重写抽象方法

    

enum Grade3{
    A(){
        @Override
        public String getValue() {
            return "90-100";
        }
    }
    ,B(){
        @Override
        public String getValue() {
            return "80-89";
        }
    };
    public String value;
    abstract public String getValue();
}

二、反射

    反射用于构建框架

    给定类完整名称,获得类的字节码(也叫加载类),然后获取类中各个字段和方法,并加以调用

反射的第一步,加载类

    加载类有三种方式

    以Person类为例

    1.Class clazz = Class.forname(javaweb.study.reflect.Person);//包含包名的完整类名

    2.Class clazz = new Person().getClass();

    3.Class clazz = Person.class;

然后就是调用类的方法

    1.构造函数

    Constructor c = clazz.getConstructor(args);//args为构造函数的参数类型,String.class,int.class等

    获取到构造函数后,创建对象,用newInstance方法

    2.普通方法

    Method m = clazz.getMethod(name,args);//name为方法名,args为参数类型

    m.invoke(object,args);//如果调用的为静态方法,object可以填null

    若要调用的方法访问限定符为private,则需用getDeclaredMethod,获取到方法后,用setAccessible(ture)暴力反射

    特别的,反射调用参数是数组的方法,参数要用一个数组包裹起来,为了兼容jdk1.4,Java编译器做出的妥协所致

    3.字段

    Field f = clazz.getField("name");

    Object obj = f.get(p);//p为对象

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值