zoukankan      html  css  js  c++  java
  • java反射(Field的应用)

    //$Id: DirectPropertyAccessor.java 11405 2007-04-15 12:50:34Z max.andersen@jboss.com $
    package org.hibernate.property;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.Map;
    
    import org.hibernate.HibernateException;
    import org.hibernate.PropertyAccessException;
    import org.hibernate.PropertyNotFoundException;
    import org.hibernate.engine.SessionFactoryImplementor;
    import org.hibernate.engine.SessionImplementor;
    import org.hibernate.util.ReflectHelper;
    
    /**
     * Accesses fields directly.
     * @author Gavin King
     */
    public class DirectPropertyAccessor implements PropertyAccessor {
    
        public static final class DirectGetter implements Getter {
            private final transient Field field;
            private final Class clazz;
            private final String name;
            DirectGetter(Field field, Class clazz, String name) {
                this.field = field;
                this.clazz = clazz;
                this.name = name;
            }
            public Object get(Object target) throws HibernateException {
                try {
                    return field.get(target);//返回指定对象上此 Field 表示的字段的值。
                }
                catch (Exception e) {
                    throw new PropertyAccessException(e, "could not get a field value by reflection", false, clazz, name);
                }
            }
    
            public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
                return get( target );
            }
    
            public Method getMethod() {
                return null;
            }
            public String getMethodName() {
                return null;
            }
            public Class getReturnType() {
                return field.getType();
            }
    
            Object readResolve() {
                return new DirectGetter( getField(clazz, name), clazz, name );
            }
            
            public String toString() {
                return "DirectGetter(" + clazz.getName() + '.' + name + ')';
            }
        }
    
        public static final class DirectSetter implements Setter {
            private final transient Field field;
            private final Class clazz;
            private final String name;
            DirectSetter(Field field, Class clazz, String name) {
                this.field = field;
                this.clazz = clazz;
                this.name = name;
            }
            public Method getMethod() {
                return null;
            }
            public String getMethodName() {
                return null;
            }
            public void set(Object target, Object value, SessionFactoryImplementor factory) throws HibernateException {
                try {
                    field.set(target, value);//将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
                }
                catch (Exception e) {
                    if(value == null && field.getType().isPrimitive()) {
                        throw new PropertyAccessException(
                                e, 
                                "Null value was assigned to a property of primitive type", 
                                true, 
                                clazz, 
                                name
                            );                    
                    } else {
                        throw new PropertyAccessException(e, "could not set a field value by reflection", true, clazz, name);
                    }
                }
            }
    
            public String toString() {
                return "DirectSetter(" + clazz.getName() + '.' + name + ')';
            }
            
            Object readResolve() {
                return new DirectSetter( getField(clazz, name), clazz, name );
            }
        }
    
        private static Field getField(Class clazz, String name) throws PropertyNotFoundException {
            if ( clazz==null || clazz==Object.class ) {
                throw new PropertyNotFoundException("field not found: " + name); 
            }
            Field field;
            try {
                field = clazz.getDeclaredField(name);//返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
            }
            catch (NoSuchFieldException nsfe) {
                field = getField( clazz, clazz.getSuperclass(), name );
            }
            if ( !ReflectHelper.isPublic(clazz, field) ) field.setAccessible(true);
            return field;
        }
    
        private static Field getField(Class root, Class clazz, String name) throws PropertyNotFoundException {
            if ( clazz==null || clazz==Object.class ) {
                throw new PropertyNotFoundException("field [" + name + "] not found on " + root.getName()); 
            }
            Field field;
            try {
                field = clazz.getDeclaredField(name);
            }
            catch (NoSuchFieldException nsfe) {
                field = getField( root, clazz.getSuperclass(), name );
            }
            if ( !ReflectHelper.isPublic(clazz, field) ) field.setAccessible(true);
            return field;
        }
        
        public Getter getGetter(Class theClass, String propertyName)
            throws PropertyNotFoundException {
            return new DirectGetter( getField(theClass, propertyName), theClass, propertyName );
        }
    
        public Setter getSetter(Class theClass, String propertyName)
            throws PropertyNotFoundException {
            return new DirectSetter( getField(theClass, propertyName), theClass, propertyName );
        }
    
    }
  • 相关阅读:
    递延收益的主要账务处理
    少数股东权益
    一揽子交易中处置价款与净资产账面价值差额为什么计入其他综合收益
    为什么权益法下其他综合收益合并时要计入投资收益
    R语言代写实现MCMC中的Metropolis–Hastings算法与吉布斯采样
    加速R语言代码的策略
    R语言代写:EM算法和高斯混合模型的实现
    R语言代写进行网站评论文本数据挖掘聚类
    R语言代写对推特数据进行文本情感分析
    WEKA代写文本挖掘分析垃圾邮件分类模型
  • 原文地址:https://www.cnblogs.com/toSeeMyDream/p/4378966.html
Copyright © 2011-2022 走看看