java 类型信息_Java类型信息

一、类型信息RTTI

1、class.getInterfaces 可以获取到当前类实现的接口数组(注:不包括父类实现的接口)。

2、为使用类而做的准备三步骤

1)类加载器进行加载;2)链接:验证类的字节码,为静态域分配存储空间;3)初始化:初始化父类,执行静态初始化器与静态初始化块。

当使用字面常量引用class时,会发生前两个步骤(Class initiable = Initable.class);而引用类静态基本类型的常量时也不发生初始化 (static final int staticFinal= 47),其他情况会导致初始化步骤(static final Integer staticFinal= 47;static final int staticFinal2 = hello.rand.nextInt(1000); static int staticNonFinal= 47;)

3、对Class使用泛型,如 Class>, Class extends Number> 前者接受任意类型,后者接受Number子类。Class不能接受Number子类如int

4、类型的动态判断  "zcs" instanceOf String, String.class.isInstance("zcs");  这两种判断方式都考虑了继承体系,也就是子类对象也属于父类的实例。

5、实现一个抽象工厂

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

interface Factory{ T create();}classPart{static List> partFactories = new ArrayList>();static{

partFactories.add(newFuelFilter.Factory());

}

}class Filter extendsPart{}class FuelFilter extendsFilter{public static class Factory implements test.Factory{publicFuelFilter create(){return newFuelFilter();

}

}

}

View Code

二、反射

RTTI于反射之间主要区别在于,打开class文件的时机,RTTI要求在编译期就能够打开,而反射则是在运行期。

1、通过Class获取三种属性:hello.class.getMethods,hello.class.getConstructors,hello.class.getFields

设计模式的关键就是封装修改。

2、动态调用函数

public static void print(String ss,String aa)

Method method = hello.class.getDeclaredMethod("print",new Class[]{String.class,String.class});

method.setAccessible(true);

//由于print是static方法,因此第一个参数可以传递null

method.invoke(new hello(), "zhongchangshou hahah","zhongchangchu");

3、通过反射可以调用任何类的私有成员,只要知道其函数名字

private voidprint(){

System.out.println("I'm hide.");

}

Method method= hello.class.getDeclaredMethod("print");

method.setAccessible(true);

method.invoke(new hello());

即使对于已经编译的代码,使用 javap -private C 方式可以显示所有成员,包括私有成员,然后有这些名字后就可以通过反射调用。

javac test/hello.java

javap-private -C test.hello

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值