java反射机制简单认知

来源:互联网 发布:菜鸟网络cfo 编辑:程序博客网 时间:2024/05/17 01:19
获取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);
    }
}


0 0
原创粉丝点击