Java类型信息

1.使用类字面常量:使用类字面常量不仅简单,还安全,因为它在编译时就会受到检查,不需要置于try语句块中,它根除了对forName方法的引用。类字面常量使用Class.forName时会自动的初始化。可以应用于普通的类,也可以应用于接口、数组以及基本数据类型。

class A {
    static final int a = 12;

    static {
        System.out.println("A");
    }
}

class A2 {
    static int a2 = 123;

    static {
        System.out.println("A2");
    }
}

class A3 {
    static int a3 = 23;

    static {
        System.out.println("A3");
    }
}

public class Test9 {
    public static void main(String[] args) {
        Class c = A.class;
        System.out.println("创建A之后");
        System.out.println(A.a);
        System.out.println(A2.a2);
        try {
            Class c1 = Class.forName("SixtySix.A3");
        } catch (ClassNotFoundException e) {
            System.out.println("找不到A3");
            System.exit(1);
        }
        System.out.println("创建A3之后");
        System.out.println(A3.a3);
    }
}

2.instanceof与Class的等价性:instanceOf和isInstance()的结果一样,比较的时候都考虑了继承关系。equals()和==比较是否为同一个类,没有考虑继承关系。

class Letter {
}

class A1 extends Letter {
}

public class Test10 {
    public static void test(Object o) {
        System.out.println(o.getClass());
        System.out.println((o instanceof Letter));
        System.out.println(o instanceof A1);
        System.out.println(Letter.class.isInstance(o));
        System.out.println(A1.class.isInstance(o));
        System.out.println(o.getClass() == Letter.class);
        System.out.println(o.getClass() == A1.class);
        System.out.println(o.getClass().equals(Letter.class));
        System.out.println(o.getClass().equals(A1.class));
    }

    public static void main(String[] args) {
        test(new Letter());
        test(new A1());
    }
}

3.反射:运行时的类信息:在编译时,编译器必须知道所要通过RTTI来处理的类。反射的功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。   在用反射做事情之前必须先加载那个类的Class对象。

class Person {
    private String name = "Tom";
    public int age = 18;

    public Person() {
    }

    private void say() {
        System.out.println("say()");
    }

    public void work() {
        System.out.println("work()");
    }
}

public class Test11 {
    public static void main(String[] args) {
        Class c = Person.class;
        String className = c.getName();
        System.out.println(className);
        Field[] f = c.getDeclaredFields();
        for (Field field : f) {
            System.out.println(field.getName());
        }
        Method[] m = c.getDeclaredMethods();
        for (Method method : m) {
            System.out.println(method.getName());
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值