Java Reflection 是一种
内省机制,帮助程序在
运行时对自身及软件环境进行检查,并根据检查得到的程序结构,改变自身的部分行为。
核心类为
java.lang.Class 类,抽象了程序的元数据,每一个类的元数据就是一个Class对象实例。这个Class实例是一个静态实例,对应类的每一个实例都会关联这个静态实例。通过Class类可以查询该类的方法、字段、接口、构造器等一系列信息。详见下面。
对象回去自身对应的Class实例是通过继承自Object类的getClass()方法;
对于基本类型,每一种也有一个名为class的静态实例,如int.class double.class boolean.class;
对于数组类型,也有Object[].class, 注意 int[][].class==int[].class
判断对象类型的接口:
String getName() 获得类全名
Class getComponentType() 如果对象是数组,返回数据中元素的类类型
boolean isArray()
boolean isInterface()
boolean isPrimitive()
boolean isAnnotation()
###########################################################################################################
接口
java.lang.Class中定义的检查接口的接口:
Class[] getInterfaces()
Class getSuperClass() 直系父类 ,对于Object、接口、void关键字、基本类型,返回null
boolean isAssignableFrom(Class cls) 该类是参数的类型或参数的父类型
boolean isInstance(Object obj) 该类是参数的实例或者参数的子类实例
Class类和Object类存在比较纠结的关系
Class.class.isIntance(Class.class) == true Class类的class实例是Class本身的实例
Class.class.isInstance(Object.class) == true
Object.class.isAssignableFrom(Class.class) == true
Object.class.isIntance(Class.class) == true
###########################################################################################################
java.lang.reflect部分类图
###########################################################################################################
java.lang.reflect.Constructor
java.lang.Class中相关方法
Constructor getConstructor(Class[] parameterTypes)
Constructor getDeclaredConstructor(Class[]parameterTypes)
Constructor[] getConstructors()
Constructor[] getDeclaredConstructors()
java.lang.reflect.Constructor
Class getDeclaredClass()
Class[] getExceptionTypes()
int getModifiers()
String getName()
Class[] getParameterTypes()
Object newInstance(Object[] initArgs) 创建实例
对于数组,使用 java.lang.reflect.Array.newInstance(String.class,5)形式创建实例
###########################################################################################################
java.lang.reflect.Method
java.lang.Class类中定义了如下接口查询一个类所具有的方法。
Method getMethod(String name,Class[]parameterTypes)
Method[] getMethods()
上述2个接口查询继承获得和自身声明的方法
Method getDeclaredMethod(String name,Class[]parameterTypes)
Method[] getDeclaredMethods()
上述2个接口查询自身声明的方法
java.lang.reflect.Method类定义的方法
Class getDeclaringClass() 声明该方法的类实例
Class[] getExceptionTypes() 方法的异常类型
int getModifiers() 方法的可见性
String getName() 方法名
Class[] getParameterTypes() 方法参数类型
Class getReturnType() 方法返回类型
Object invoke(Object obj,Object[]args) 反射调用一个对象上面的该方法
###########################################################################################################
java.lang.reflect.Field
java.lang.Class类中关于Field的相关方法:
Field getField(String name)
Field[] getFields()
Field getDeclaredField(String name)
Field[] getDeclaredFields()
java.lang.relect.Field中主要方法
Class getType() 返回字段的Class
Class getDeclaringClass() 返回什么该字段的Class
String getName()
int getModifiers()
Object get(Object obj) 返回obj该字段的值
boolean getBoolean(Object obj)
void set(Object obj,Object value) 设置obj该字段的值
void setBoolean(Object obj,boolean value)
###########################################################################################################
java.lang.reflect.Modifier 字段或者方法的访问性
static boolean isPublic(int mod)
static boolean isPrivate(int mod)
共包括以下:
public static native volatile protected transient
abstract synchronized strictfp private final
###########################################################################################################
动态加载
Class cls = Class.forName(String className);
Object obj = cls.newInstance();
动态加载机制使得可以避开编译器类范围的限制,常见场景是jdbc驱动。动态加载机制也是通过ClassLoader实现。
通过动态加载机制的类名并不是一般意义的类名,而是:
1、基本类型,首字母大写,如 int -> I
2、引用类型,L+全类名,如 Ljava.lang.String
3、数组类型,[+***, 如[I, [Ljava.lang.String , [[I, [[Ljava.lang.String
注意:基本类型,不能通过Class.forName()加载,会抛出异常
posted on 2011-03-31 14:06
liucs 阅读(319)
评论(0) 编辑 收藏 所属分类:
Java