5.7反射

2019-03-24  本文已影响0人  十六只猴子王

反射库,提供了一个非常丰富且精心设计的工具集,以使编写能够动态java代码的程序,咋i设计和运行添加类时,能够快速的开发工具动态地查询新添加类的功能
能够分析类能力的程序称为反射,反射机制可以用来

Class类

Java进行时系统始终为所有的对象维护一个被称为通行时的类型标识。这个信息保存着每个对象所属的类足迹 。 虚拟机利用通行时类型信息选择相应的方法的执行

捕获异常

当程序运行过程中发生错误时, 就会 “抛出异常” 。 抛出异常比终止程序要灵活得多,因为提供一个“捕获”异常处理器对异常情况进行处理

try{
  可能引发异常的语句}
catch(Exception e){
   处理程序动作}
try{
 String name = ...;
Class c1 = Class.forName(name);
do someting with c1}
catch(Exception e){
   e.printStackTrace();}/*Throwable类的printStackTrace方法打印出栈的轨迹。 
Throwable是Exception类的超类*/

如果装名不存在,则将跳过try块中的剰余代码,程序直接进入catch子句 如果try块中没有抛出任何异常, 那么会跳过calch子句的处理器代码
stailc Class foName(String className)
返回描述类名为className的Class对象
Object newInstance()
返回这个类的一个新实例。
Object newInstance(Object[] args)
构造一个这个构造器所属类的新实例。
void printStackTrace()
将Throwable对象和栈的轨迹输出到标准错误流。

利用反射分析类的能力

检查类的结构:Field类有一个getType方法,用来返回描述域所属类型的Class对象。Method 和Constructor 类有能够报告参数类型的方法,Method类还有可以报告返回类型的方法。

Class<?> perClazz = null;
try{
  perClazz = Clazz.forName("reflect.Person");
}catch(ClassNotFoundException e)
  e.printStackTrace();
}
Method[] declaredMethods=perClazz.getDeclardeMethods();
for(Method declaredMethod:declaredMethod)
{System.out.println(declaredMethod);
}
Class<?> perClazz = null;
try{
  perClazz = Clazz.forName("reflect.Person");
}catch(ClassNotFoundException e)
  e.printStackTrace();
}
}
Class<?> [] interface = perClazz.getInterfaces();
for(Class<?> inter:interfaces){
System.out.println(inter);
}
Class<?> perClazz = null;
try{
  perClazz = Clazz.forName("reflect.Person");
}catch(ClassNotFoundException e)
  e.printStackTrace();
}
Class<?> superclass = perClass.getSuperclass();
System.out.println(superclass);
}
Class<?> perClazz = null;
try{
  perClazz = Clazz.forName("reflect.Person");
}catch(ClassNotFoundException e)
  e.printStackTrace();
}
Construcor<?>[] constructors = perClazz.getConstructors();
for(Construcor<?>constructor:constructors){
System.out.println(constructor);}
Class<?> perClazz = null;
try{
  perClazz = Clazz.forName("reflect.Person");
}catch(ClassNotFoundException e)
  e.printStackTrace();
}
Field[] fields = perClazz.getFields();
forIField field:fields){
System.out.println(fields)}
//取所有的属性 
Field[] declareFields = perClazz.getDeclareFields();
forIField declareField:declareFields ){
System.out.println(declareField)}
上一篇下一篇

猜你喜欢

热点阅读