您的位置:首页 > 编程语言 > Java开发

java反射机制简单认知

2016-08-05 15:37 344 查看
获取Class对象有三种方式:

1、通过Object类的getClass()方法,例如:

Class c1 = new String("").getClass();

2、通过Class类的静态方法forName()来实现:

Class c2 = Class.forName("MyObject");

3、若果说T是一个已定义的类型的话,在Java中,他的.class文件名:T.class就代表了与其匹配的Class对象

Class c3 = Manager.class;

Class c4 = int.class;

Class类中也存在一些重要的方法:

1、getName()

一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。

2、newInstance()

该方法可以根据摸个Class对象产生其对应类的实例。需要强调的是,他调用的时此类的默认构造函数。

MyObject x = new MyObject();

MyObject y = x.getClass().newInstance();

3、getClassLoader()

返回该Class对象对应的类的加载器

4、getSuperClass()

返回某自雷所对应的直接父类所对应的Class对象。

5、isArray()
判定此Class对象所对应的是否是一个数组对象

/**

 * 提供关于Java反射的工具

 *

 * @author QzC

 *

 */

public class RelUtils {

    /**

     * 得到某个对象的公共属性

     *

     * @param owner

     * @param fiedName

     * @return

     * @throws Exception

     */

    public Object getProperty(Object owner, String fiedName) throws Exception {

        Class ownerClass = owner.getClass();

        

        Field filed = ownerClass.getField(fiedName);

        

        Object property = filed.get(owner);

        

        return property;

    }

    

    /**

     * 得到某类的静态公共属性

     *

     * @param className

     * @param filedName

     * @return

     * @throws Exception

     */

    public Object getStaticProperty(String className, String filedName) throws Exception{

        Class ownerClass = Class.forName(className);

        

        Field field = ownerClass.getField(filedName);

        

        Object property = field.get(ownerClass);

        

        return property;

    }

    

    /**

     * 执行某对象的方法

     *

     * @param owner

     *            对象

     * @param methodName

     *            方法名

     * @param args

     *            参数

     * @return 这个方法的返回值

     * @throws Exception

     */

    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);

    }

    

    /**

     * 执行某类的静态方法

     *

     * @param className

     *            类的全类名(包名+类名)

     * @param methodName

     *            方法名

     * @param args

     *            参数

     * @return 执行方法返回的结果

     * @throws Exception

     */

    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);

    }

    

    /**

     * 新建实例

     *

     * @param className

     *            类名(包名+类名)

     * @param args

     *            构造函数的参数

     * @return

     * @throws Exception

     */

    public Object newInstatnce(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);

    }

    

    /**

     * 某对象是否是该类的实例

     *

     * @param obj

     *            对象

     * @param cls

     *            类

     * @return 如果obj是此类的实例,则返回true

     */

    public boolean isInstance(Object obj, Class cls){

        return cls.isInstance(obj);

    }

    

    /**

     * 得到数组中某个元素

     *

     * @param array

     *            数组

     * @param index

     *            索引

     * @return 返回指定数组对象中索引组件的值

     */

    public Object getByArry(Object array, int index){

        return Array.get(array, index);

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: