5.7反射
2019-03-24 本文已影响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)}