反射的概念
什么是反射?
Java 程序在运行期间可以动态加载、解析和使用一些在编译阶段并不确定的类型数据,这一机制被称为反射(Reflection)。
反射机制提供的功能:
加载运行时才能确定的数据类型,
解析类的结构、获取其内部信息,
操作该类型或其实例
访问属性
调用方法
创建新对象
java.lang.Class介绍
java.lang.Class 类是final的类,由最底层的classLoader加载的。Class 类的实例用于表示运行时的Java 数据类型,包括类、接口、数组、枚举、注解、基本数据类型。
在类加载时,Java 虚拟机会自动创建相应Class 对象。
Java.lang.reflect包:
java.lang.reflect.Field
java.lang.reflect.Method
java.lang.reflect.Constructor<T>
java.lang.reflect.Modifier
java.lang.reflect.Array
比如加载m类的属性(自定义的User的show方法)
public static void main(String[] args) throws Exception {
Class c = Class.forName(“User");
Object obj = c.newInstance();
Method[] method = c.getMethods();
for (Method m : method) {
if (m.getName().equals("show")) {
m.invoke(obj); }
}
}
如果函数带参数:
m.invoke(Object, …);
Object[] param = {10, “wujin”};
m.invoke(Object, param);
函数重载
Class[] type = null / {int.class, String.class};
Method m = c.getMethod("show", type); //这里就调用class类的getMethod方法了,如果show有参数,就要这样调用要带type数组,其中type为参数类型数组
m.invoke(obj); //这里就调用Method类的invoke方法了,如果show有参数,就要这样调用 m.invoke(obj,para); ,其中para为参数值数组
补充:class类的getMethod(String,class<>)方法
Method | getMethod(String name, Class<?>... parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 |
补充:Method类的invoke方法
Object | invoke(Object obj,Object... args) 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 |
Class.forName()针对不同的数据类型
针对引用数据类型
调用静态方法Class.forName()
Class.forName("com.itjob.wujin.Person");
Class.forName("oracle.jdbc.dirver.OracleDriver");
调用Object 类中定义的getClass() 方法
Person p = new Person();
Class c1 = p.getClass();
Class c2 = "Hello".getClass(); //"Hello".class会报错,因为String对象不能调用class,而getClass是object的方法,故对象可以调用
Class<?> | getClass() 返回此 Object 的运行时类 |
使用.class 表达示
Class c1 = String.class;
Class c2 = com.itjob.wujin.Person.class;
Class c3 = oracle.jdbc.dirver.OracleDriver.class
针对基本数据类型及void
使用.class 表达式
Class c1 = int.class;
Class c2 = double.class;
Class c3 = void.class;
调用相应封装类的Type 属性
Class c1 = Integer.TYPE;
Class c2 = Double.TYPE;
Class c3 = Void.TYPE;
附带class的方法
方法摘要 | ||
---|---|---|
| asSubclass(Class<U> clazz) 强制转换该 Class 对象,以表示指定的 class 对象所表示的类的一个子类。 | |
T | cast(Object obj) 将一个对象强制转换成此 Class 对象所表示的类或接口。 | |
boolean | desiredAssertionStatus() 如果要在调用此方法时将要初始化该类,则返回将分配给该类的断言状态。 | |
static Class<?> | forName(String className) 返回与带有给定字符串名的类或接口相关联的 Class 对象。 | |
static Class<?> | forName(String name, boolean initialize,ClassLoader loader) 使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class 对象。 | |
| getAnnotation(Class<A> annotationClass) 如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。 | |
Annotation[] | getAnnotations() 返回此元素上存在的所有注释。 | |
String | getCanonicalName() 返回 Java Language Specification 中所定义的底层类的规范化名称。 | |
Class<?>[] | getClasses() 返回一个包含某些 Class 对象的数组,这些对象表示属于此 Class 对象所表示的类的成员的所有公共类和接口。 | |
ClassLoader | getClassLoader() 返回该类的类加载器。 | |
Class<?> | getComponentType() 返回表示数组组件类型的 Class 。 | |
Constructor<T> | getConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 | |
Constructor<?>[] | getConstructors() 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。 | |
Annotation[] | getDeclaredAnnotations() 返回直接存在于此元素上的所有注释。 | |
Class<?>[] | getDeclaredClasses() 返回 Class 对象的一个数组,这些对象反映声明为此 Class 对象所表示的类的成员的所有类和接口。 | |
Constructor<T> | getDeclaredConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。 | |
Constructor<?>[] | getDeclaredConstructors() 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。 | |
Field | getDeclaredField(String name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 | |
Field[] | getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。 | |
Method | getDeclaredMethod(String name,Class<?>... parameterTypes) 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 | |
Method[] | getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 | |
Class<?> | getDeclaringClass() 如果此 Class 对象所表示的类或接口是另一个类的成员,则返回的 Class 对象表示该对象的声明类。 | |
Class<?> | getEnclosingClass() 返回底层类的立即封闭类。 | |
Constructor<?> | getEnclosingConstructor() 如果该 Class 对象表示构造方法中的一个本地或匿名类,则返回 Constructor 对象,它表示底层类的立即封闭构造方法。 | |
Method | getEnclosingMethod() 如果此 Class 对象表示某一方法中的一个本地或匿名类,则返回 Method 对象,它表示底层类的立即封闭方法。 | |
T[] | getEnumConstants() 如果此 Class 对象不表示枚举类型,则返回枚举类的元素或 null。 | |
Field | getField(String name) 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 | |
Field[] | getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。 | |
Type[] | getGenericInterfaces() 返回表示某些接口的 Type,这些接口由此对象所表示的类或接口直接实现。 | |
Type | getGenericSuperclass() 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。 | |
Class<?>[] | getInterfaces() 确定此对象所表示的类或接口实现的接口。 | |
Method | getMethod(String name,Class<?>... parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 | |
Method[] | getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共member 方法。 | |
int | getModifiers() 返回此类或接口以整数编码的 Java 语言修饰符。 | |
String | getName() 以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。 | |
Package | getPackage() 获取此类的包。 | |
ProtectionDomain | getProtectionDomain() 返回该类的 ProtectionDomain 。 | |
URL | getResource(String name) 查找带有给定名称的资源。 | |
InputStream | getResourceAsStream(String name) 查找具有给定名称的资源。 | |
Object[] | getSigners() 获取此类的标记。 | |
String | getSimpleName() 返回源代码中给出的底层类的简称。 | |
Class<? superT> | getSuperclass() 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class 。 | |
TypeVariable<Class<T>>[] | getTypeParameters() 按声明顺序返回 TypeVariable 对象的一个数组,这些对象表示用此 GenericDeclaration 对象所表示的常规声明来声明的类型变量。 | |
boolean | isAnnotation() 如果此 Class 对象表示一个注释类型则返回 true。 | |
boolean | isAnnotationPresent(Class<? extendsAnnotation> annotationClass) 如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。 | |
boolean | isAnonymousClass() 当且仅当底层类是匿名类时返回 true。 | |
boolean | isArray() 判定此 Class 对象是否表示一个数组类。 | |
boolean | isAssignableFrom(Class<?> cls) 判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口。 | |
boolean | isEnum() 当且仅当该类声明为源代码中的枚举时返回 true。 | |
boolean | isInstance(Object obj) 判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。 | |
boolean | isInterface() 判定指定的 Class 对象是否表示一个接口类型。 | |
boolean | isLocalClass() 当且仅当底层类是本地类时返回 true。 | |
boolean | isMemberClass() 当且仅当底层类是成员类时返回 true。 | |
boolean | isPrimitive() 判定指定的 Class 对象是否表示一个基本类型。 | |
boolean | isSynthetic() 如果此类是复合类,则返回 true,否则 false。 | |
T | newInstance() 创建此 Class 对象所表示的类的一个新实例。 | |
String | toString() 将对象转换为字符串。 |