java反射
来源:互联网 发布:淘宝卖家卖出多久到账 编辑:程序博客网 时间:2024/06/02 02:53
反射
反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示Java类的Class类显示要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等等。
一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以的得到这些实例对象后,得到这些实例对象后有什么用呢?怎么用呢?这正是学习和应用反射的要点。
构造方法的反射应用
Consturctor(构造器)类代表某个类中的一个构造方法
@1@ 得到某个类所有的构造方法:例如:Constructor [] constructors = Class.forName("java.lang.String").getConstructors();
@2@ 得到某一个构造方法:例如:Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
@3@ 创建实例对象:通常方式:String str=new String(new StringBuffer("abc"));
反射方式:String str=(String) constructor.newInstance(new StringBuffer("abc"));
Java反射机制主要提供了以下功能:
1.
/** * 得到某个对象的属性 * @param owner * @param fieldName * @return * @throws Exception */@SuppressWarnings("rawtypes")public Object getProperty(Object owner, String fieldName) throws Exception {Class ownerClass = owner.getClass();Field field = ownerClass.getField(fieldName);Object property = field.get(owner);return property;}Class
Field
Object
2.
/** * 得到某个类的静态属性 * @param className * @param fieldName * @return * @throws Exception */@SuppressWarnings("rawtypes")public Object getStaticProperty(String className, String fieldName)throws Exception {Class ownerClass = Class.forName(className);Field field = ownerClass.getField(fieldName);Object property = field.get(ownerClass);return property;}Class
Field
Object
3.
/** * 执行某对象的方法 * @param owner * @param methodName * @param args * @return * @throws Exception */@SuppressWarnings({ "rawtypes", "unchecked" })public Object invokeMethod(Object owner, String methodName, Object[] args)throws Exception {Class ownerClass = owner.getClass();Class[] argsClass = new Class[args.length];for (int i = 0, j = args.length; i < j; i++) {argsClass[i] = args[i].getClass();}Method method = ownerClass.getMethod(methodName, argsClass);return method.invoke(owner, args);}Class
5~9行:配置参数的Class数组,作为寻找Method的条件。
Method
method.invoke(owner,
4.
/** * 执行某个类的静态方法 * @param className * @param methodName * @param args * @return * @throws Exception */@SuppressWarnings({ "rawtypes", "unchecked" })public Object invokeStaticMethod(String className, String methodName,Object[] args) throws Exception {Class ownerClass = Class.forName(className);Class[] argsClass = new Class[args.length];for (int i = 0, j = args.length; i < j; i++) {argsClass[i] = args[i].getClass();}Method method = ownerClass.getMethod(methodName, argsClass);return method.invoke(null, args);}
基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。
5.
/** * 新建实例 * @param className * @param args * @return * @throws Exception */@SuppressWarnings({ "rawtypes", "unchecked" })public Object newInstance(String className, Object[] args) throws Exception {Class newoneClass = Class.forName(className);Class[] argsClass = new Class[args.length];for (int i = 0, j = args.length; i < j; i++) {argsClass[i] = args[i].getClass();}Constructor cons = newoneClass.getConstructor(argsClass);return cons.newInstance(args);}
这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。
Class
第5~第9行:得到参数的Class数组。
Constructor
cons.newInstance(args):新建实例。
6.
/** * 判断是否为某个类的实例 * @param obj * @param cls * @return */@SuppressWarnings("rawtypes")public boolean isInstance(Object obj, Class cls) {return cls.isInstance(obj);}
7.
/** * 得到数组中的某个元素 * @param array * @param index * @return */public Object getByArray(Object array, int index) {return Array.get(array, index);}
- 【反射】JAVA反射机制
- JAVA 反射
- java 反射
- Java反射
- java反射
- java反射
- JAVA反射
- java 反射
- Java 反射
- java 反射
- Java反射
- java反射
- JAVA 反射
- java 反射
- Java反射
- java反射
- java 反射
- java 反射
- 中兴推出地空宽带方案:航班4G上网将成现实
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- Struts2中Action访问Servlet API总结
- 类似微信陌陌app百万级并发系统源码转让
- backtrace有的情况会崩溃
- java反射
- 手把手教你在ubuntu上安装apache和mysql和php
- Python/Perl/Shell 输出彩色字体
- 博客搬家
- HDU1867 A + B for you again
- 函数通常返回多个值
- web服务器
- ExtJS的分页
- 用Vim写一个简单的Hello,World程序