深入解析Java反射
什么是反射?
反射是允许运行中的Java程序获取自身的信息,并且可以操作类或对象的内部属性
- 在运行时分析类的能力
- 在运行时查看对象
- 实现通用的数组操作代码
- 利用Method对象,这个对象很像cpp中的函数指针
反射的主要用途
- 当我们使用idea时,输入一个对象或类向调用它的属性或方法时,编译器会自动列出它的属性或方法,这里就应用了反射
- 反射最重要的应用是开发各种通用框架
反射的基本运用
获取Class对象
-
使用Class类的forName静态方法
public static Class<?> forName(String className) //在JDBC中常用此方法加载数据库驱动 Class.forName(driver)
-
直接获取一个对象的class
Class<?> klass = int.class; Class<?> classInt = Integer.TYPE;
-
调用某个对象的getClass()方法
StringBuilder str = new StringBuilder("123"); Class<?> klass = str.getClass();
判断是否为某个类的实例
一般我们会使用instanceof关键字来判断
public native boolean isInstance(Object obj);
通过反射来生成对象主要有两种方式
-
使用Class对象的newInstance()方法来创建Class对象对应类的实例
Class<?> c = String.class; Object str = c.newInstance();
-
先通过Class对象获取指定的Constructor对象,在调用Constructor对象的newInstance()方法来创建实例
Class<?> c = String.class; Constructor constructor = c.getConstructor(String.class); Object obj = constructor.newInstance("23333");
获取某个对象的方法合集
-
getDeclaredMethods
方法返回类或接口声明的所有方法,包括public,protected,default和private方法,但不包括继承的方法public Method[] getDeclaredMethods() throws SecurityException
-
getMethods
方法返回某个类的所有public方法,包括其继承类的公用方法public Method[] getMethods() throws SecurityException
-
getMethod
方法返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象public Method getMethod(String name, Class<?>... parameterTypes)
获取构造器信息
主要是通过CLass类的getConstructor方法得到Constructor类的一个实例
public T newInstance(Object ... initargs)
获取类的成员变量的信息
- getField:访问public的成员变量
- getDeclaredField:所有已声明的成员变量,但不能得到其父类的成员变量
调用方法
当我们从类中获取了一个方法后,我们就可以用invoke()方法来调用这个方法
利用反射创建数组
注意事项
如果不需要动态地创建一个对象,那么就不需要使用反射,因为反射会额外消耗一定的系统资源
另外反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题