JAVA反射机制(JAVA Reflection)是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
写在前面:
反射的用途:
使应用程序执行本来不可能的操作。
可扩展性功能:
应用程序可以通过使用完全限定名称创建可扩展性对象的实例来使用外部的用户定义类。
反射是强大的,但不应随意使用。如果可以在不使用反射的情况下执行操作,则优选避免使用它!(注意:用的少不代表可以轻率)
反射的缺点:
绩效开销:
由于反射涉及动态解析的类型,因此无法执行某些Java虚拟机优化。因此,反射操作的性能低于非反射操作,并且应避免在性能敏感应用程序中频繁调用的代码段中。
安全限制:
Reflection需要运行时权限,在安全管理器下运行时可能不存在。
内部接触:
由于反射允许代码执行在非反射代码中非法的操作,例如访问private
字段和方法,因此使用反射会导致意外的副作用,这可能导致代码功能失常并可能破坏可移植性。反射代码打破了抽象。
================================================================================================
类是用来描述对象的
反射可以理解为用来描述类的
Class 类本身
Package 类所在的包
Field 类的属性
Method 类中的方法
Constructor 类中的构造方法
Annotation 类中的注释
如何获取Class?
有三种方法,各有千秋
1.Class的静态方法 forName("类全名");
2.类.class关键字
3.对象引用.getClass()方法
Class中的常用方法:
int = getModifiers(); 获取类的修饰符(权限||特征)
String = getName(); 获取类的全名(包名.类名)
String = getSimpleName(); 顾名思义,获取类的简单名字,只有类名,没有包
Class = getSuperClass(); 获取当前类父类的对应Class
Class[] = getInterfaces(); 获取当前类的父类接口
Package p = getPackage();获取当前类所属的包; p.getName() 获取包名
Class[] = getClasses(); 回去类中的内部类(public)
-------------------------------------------------------
Object = newInstance(); 获取当前类的对象(相当于调用了无参数的构造方法)
如果无参数的构造方法没有找到或者被覆盖,则抛出异常(NosuchMethodExpection)
Field = getFiled("属性名") 获取类中的属性(公有的,自己类+父类)
Field[] = getFields ();获取类中的全部属性(公有的,自己类+父类)
Field = getDeclaredField("属性名");获取当前类中的属性(公有的+私有的都可以,只能是自己类)
Field = getDeclaredFields("属性名");获取当前类中的全部属性(公有的+私有的都可以,只能是自己类)
Field类中的常用方法
int = getModifiers(); 获取属性的修饰符(权限||特征)
Class = getType(); 获取属性的类型对应的那个class
String getName();获属性的名字
操作属性:
如果是私有属性是不可以直接操作的
set(对象,值) 给属性赋值
Object = get(对象) 从对象中取出属性的值
setAccessable(true); 设置准入许可
如何操作类中方法的对象?
Class类中的方法
Method m = class. getMethod("方法名",Class...参数类型); //获取公有的方法(自己类+父类)
Method[]m = clazz.getMetheds();获取所有公有的方法(自己类+父类)
Method m = getDeclaredmethod("方法名",参数类型的class); //获取一个方法(自己类,公有,私有)
Method[] m = getDeclaredmethods("方法名"); //获取所有方法(所有类,公有,私有)
Method类中的常用获取结构的方法
int = m.getModifiers(); //获取方法的修饰符(权限,特征)
m.getReturnType();//获取返回值的类型
m.getName();//获取方法的名称
Class[ ] mpts = m.getParameterTypes(); //获取方法参数列表的类型
Class[]mets = m.getExceptionTypes(); //获取方法抛出异常时的异常类型;
如何操作方法?
调用方法 让他执行一次
Object(自定义类型) result =(可根据类型造型) 方法.invock(对象,执行方法所要执行的所有参数...);
若方法是私有的则不允许被访问
要想访问可以设置setAccessable(ture)设置准入权进行访问
Constructor类中的常用方法
conn.getModifiers(); //获取方法的修饰符(权限,特征)
conn.getName(); //获取方法的名称
conn.getParameterTypes(); //获取方法参数列表的类型
conn.getExceptionTypes(); //获取方法抛出异常时的异常类型;
如何操作构造方法?
执行一次用来创建对象
Object = newInstance("执行构造方法时的所有参数");
conn.setAccessable(ture)设置准入权进行访问