反射机制
概念
在代码运行期间:对任意一个类,获取该类的所有属性和方法;对于任意一个对象,调用它的任意一个方法和属性。这个动态获取信息以及动态调用对象的方法的机制成为反射机制。
作用
通俗来说,反射机制就是用于动态创建对象并且动态调用方法的机制
用法
-
获取class对象
java.lang.Class类
//1、数据类型.class System.out.println(String.class); //2、对象引用.getClass() String s1 = new String("a"); System.out.println(s1.getClass()); //3、包装类.TYPE System.out.println(Integer.class); //4、Class.forName()的方式 try { System.out.println(Class.forName("java.lang.String")); } catch (ClassNotFoundException e) { e.printStackTrace(); } //5、类加载器方法获取class对象 try { //获取类加载器 “FileWriterTest”已加载的类,肯定有类加载器 ClassLoader classLoader = FileWriterTest.class.getClassLoader(); //加载类,获取指定类的class对象 Class<?> string = classLoader.loadClass("java.lang.String"); System.out.println(string); } catch (ClassNotFoundException e) { e.printStackTrace(); } Clazz.newInstance()//java9之后已过时 clazz.getDeclaredConstructor().newInstance()//推荐使用
-
获取构造方法
java.lang.reflflect.Constructor类
//无参构造,反射方式 clazz.newInstance()//java9之后已过时 clazz.getDeclaredConstructor().newInstance()//所有构造器,api推荐使用 clazz.getConstructor().newInstance()//公共构造器 //有参构造,反射方式 clazz.getConstructor(clazz.class,clazz.class).newInstance()//公共构造器 clazz.getDeclaredConstructor(clazz.class,clazz.class).newInstance()//所有构造器 //Constructor构造器的常用方法 T newInstance(Object...initargs)//构造实例 int getModifiers()//获取方法的访问修饰符 String getName()//获取方法的名称 Class<?>[] getParameterTypes()//获取方法所有参数的类型
-
获取成员变量
java.lang.reflflect.Field类
Field getDeclaredField(String name)//类中参数指定的单个成员变量信息 Field[] getDeclaredFields()//用于获取此Class对象所表示类中所有成员变量信息 // Field类的常用方法 Object get(Object obj)//获取成员变量的数值 void set(Object obj, Object value)//修改成员变量值为value void setAccessible(boolean flag)//flag为true时,取消java访问权限检查,可直接查看private成员变量,称为暴力反射 int getModifiers()//获取成员变量的访问修饰符 Class<?> getType()//获取成员变量的数据类型 String getName()//获取成员变量的名称
-
获取成员方法
java.lang.reflflect.Method类
Method getMethod(String name, Class<?>... parameterTypes)//获取类中名字为name,参数为parameterTypes的指定公共成员方法 Method[] getMethods()//获取类中所有公共成员方法 //Method类常用方法 Object invoke(Object obj,Object... args)//让对象obj调用该方法,传参args int getModifiers()//获取方法的访问修饰符 Class<?> getReturnType()//获取方法的返回值类型 String getName()//获取方法的名称 Class<?>[] getParameterTypes()//获取方法所有参数的类型 Class<?>[] getExceptionTypes()//获取方法的异常信息
-
获取其它信息
Package getPackage()//获取所在的包信息 Class<? super T> getSuperclass()//获取继承的父类信息 Class<?>[] getInterfaces()//获取实现的所有接口 Annotation[] getAnnotations()//获取注解信息 Type[] getGenericInterfaces()//获取泛型信息
获取类构造、成员变量、成员方法等的前提是获取class对象