反射
前言
java的反射机制是指在运行时获取类的属性和方法。并且能够动态修改属性和调用方法。
在日常开发中尤其是在集成代码,简化代码的时候,我们经常会遇到不能在编译时就能获取属性。这时候我们会用反射来解决这个问题。
首先要明确的是:通过来反射获取属性和调用方法,肯定比直接用代码硬编码要慢。所以反射我们需要谨慎的使用,尤其是当自己编写的方法可能会频繁调用的时候。就需要考虑加入缓存或者考虑是否不使用反射来达到效果。
对于反射为什么会慢,其实我自己也没有深刻理解。这篇stackoverflow有些讨论。
大致可以看到是:
- 反射相对直接调用,JVM并不是很好的去对其优化。
- 必须发现正在调用/创建的所有内容
- 参数需要重新包装成数组,同时还要捕获异常
InvocationTargetException
- 反射并不慢,相对网络传输、解析xml等其他耗时行为。
反射的基本使用
java中反射的api相对比较简单。这里简单写一下常用的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| public class main { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { Class<ReflectBean> clzss = ReflectBean.class; ReflectBean reflectBean = clzss.newInstance();
Field name = clzss.getField("pubName"); Field[] fields = clzss.getFields();
Field name1 = clzss.getDeclaredField("name"); Field[] declaredFields = clzss.getDeclaredFields();
name1.setAccessible(true); name1.set(reflectBean,"反射设置的name"); String str = (String)name1.get(reflectBean); System.out.println(str);
Method method = clzss.getMethod("method"); Method[] methods = clzss.getMethods(); Method priMethod = clzss.getDeclaredMethod("priMethod", String.class); Method[] declaredMethods = clzss.getDeclaredMethods();
Object invoke = method.invoke(reflectBean);
priMethod.setAccessible(true); Object string = priMethod.invoke(reflectBean, "string"); System.out.println(invoke); System.out.println(string);
System.out.println(reflectBean); } }
|
以上就是如此了。反射暂时没有发掘有撒可扩充的。有实际的比较好的实际使用再来更新。
原文作者: duteliang
原文链接: http://yoursite.com/2019/04/12/javabase/反射/
版权声明: 转载请注明出处(必须保留原文作者署名原文链接)