博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反射(Field的应用)
阅读量:4654 次
发布时间:2019-06-09

本文共 5049 字,大约阅读时间需要 16 分钟。

//$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 );    }}

 

转载于:https://www.cnblogs.com/toSeeMyDream/p/4378966.html

你可能感兴趣的文章
关于jedis2.4以上版本的连接池配置,及工具类
查看>>
记忆讲师石伟华微信公众号2017所有文章汇总(待更新)
查看>>
mechanize (1)
查看>>
FactoryBean
查看>>
Coolite动态加载CheckboxGroup,无法在后台中获取
查看>>
如何在我们项目中利用开源的图表(js chart)
查看>>
nfs服务器工作原理
查看>>
C3P0连接池工具类使用
查看>>
SVN常用命令备注
查看>>
孩子教育
查看>>
解决Cacti监控图像断断续续问题
查看>>
结构体的传参理解成员的存储方式
查看>>
python 进程与线程(理论部分)
查看>>
什么是API
查看>>
[shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
查看>>
强名称程序集(strong name assembly)——为程序集赋予强名称
查看>>
1028. List Sorting (25)
查看>>
BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
查看>>
ubuntu 重启命令,ubuntu 重启网卡方法
查看>>
Linux的学习:
查看>>