5.7反射

作者: 十六只猴子王 | 来源:发表于2019-03-24 09:32 被阅读0次

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

  • 实现数组的操作代码。
  • 利用 Method对象, 这个对象很像C++中的函数指针 。
  • 在通行中分析类的能力。
  • 在运行中査看对象,例如,编写一个toString方法供所有装使用。

Class类

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

  • Object类中的getClass( )方法将会返回一个class装型的实例。
  • Class方法是getName。这个方法将返回类的名字
  • 如果类在一个包里,包的名字也作为类名的一部分
    在启动时, 包含main方法的·类被加载。 它会加我所需要的类。 这些被加载类又要加载他们需要的类
  • 虚拟机为每个类型管理一个Class对象。因此,可以利用= =通算特实现两个类对象比骄傲操作
  • newInstanoe方法调用默认的构造器初始化新创建的对象。 如果这个类没有默认的构造器, 就会抛出一个异常。

捕获异常

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

  • 异常有两种类型:未检查异常和已检查异常,对于已检查异常,编译器将会检查是否提供了处理器
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,1.Class.forName(全类名:包名加类名)
    2.类名.class
    3.对象.getClass()
  • 获取方法
    Class入口:Class.forName();
    获取所有的公共的反法
    Medhod[] methods = perClazz.getMethods();
    (公共方法:1.本类以及父类、接口中的所有方法2.符合访问修饰符规律的方法)
  • 获取所有的公共方法
    Class入口:Class.forName();
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入口:Class.forName();
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入口:Class.forName();
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)}

相关文章

网友评论

      本文标题:5.7反射

      本文链接:https://www.haomeiwen.com/subject/exqevqtx.html