java反射(Field的應用)

來源:互聯網
上載者:User

 //$Id: DirectPropertyAccessor.java 11405 2007-04-15 12:50:34Z max.andersen@jboss.com $<br />package org.hibernate.property;</p><p>import java.lang.reflect.Field;<br />import java.lang.reflect.Method;<br />import java.util.Map;</p><p>import org.hibernate.HibernateException;<br />import org.hibernate.PropertyAccessException;<br />import org.hibernate.PropertyNotFoundException;<br />import org.hibernate.engine.SessionFactoryImplementor;<br />import org.hibernate.engine.SessionImplementor;<br />import org.hibernate.util.ReflectHelper;</p><p>/**<br /> * Accesses fields directly.<br /> * @author Gavin King<br /> */<br />public class DirectPropertyAccessor implements PropertyAccessor {</p><p>public static final class DirectGetter implements Getter {<br />private final transient Field field;<br />private final Class clazz;<br />private final String name;<br />DirectGetter(Field field, Class clazz, String name) {<br />this.field = field;<br />this.clazz = clazz;<br />this.name = name;<br />}<br />public Object get(Object target) throws HibernateException {<br />try {<br />return field.get(target);//返回指定對象上此 Field 表示的欄位的值。<br />}<br />catch (Exception e) {<br />throw new PropertyAccessException(e, "could not get a field value by reflection", false, clazz, name);<br />}<br />}</p><p>public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {<br />return get( target );<br />}</p><p>public Method getMethod() {<br />return null;<br />}<br />public String getMethodName() {<br />return null;<br />}<br />public Class getReturnType() {<br />return field.getType();<br />}</p><p>Object readResolve() {<br />return new DirectGetter( getField(clazz, name), clazz, name );<br />}</p><p>public String toString() {<br />return "DirectGetter(" + clazz.getName() + '.' + name + ')';<br />}<br />}</p><p>public static final class DirectSetter implements Setter {<br />private final transient Field field;<br />private final Class clazz;<br />private final String name;<br />DirectSetter(Field field, Class clazz, String name) {<br />this.field = field;<br />this.clazz = clazz;<br />this.name = name;<br />}<br />public Method getMethod() {<br />return null;<br />}<br />public String getMethodName() {<br />return null;<br />}<br />public void set(Object target, Object value, SessionFactoryImplementor factory) throws HibernateException {<br />try {<br />field.set(target, value);//將指定物件變數上此 Field 對象表示的欄位設定為指定的新值。<br />}<br />catch (Exception e) {<br />if(value == null && field.getType().isPrimitive()) {<br />throw new PropertyAccessException(<br />e,<br />"Null value was assigned to a property of primitive type",<br />true,<br />clazz,<br />name<br />);<br />} else {<br />throw new PropertyAccessException(e, "could not set a field value by reflection", true, clazz, name);<br />}<br />}<br />}</p><p>public String toString() {<br />return "DirectSetter(" + clazz.getName() + '.' + name + ')';<br />}</p><p>Object readResolve() {<br />return new DirectSetter( getField(clazz, name), clazz, name );<br />}<br />}</p><p>private static Field getField(Class clazz, String name) throws PropertyNotFoundException {<br />if ( clazz==null || clazz==Object.class ) {<br />throw new PropertyNotFoundException("field not found: " + name);<br />}<br />Field field;<br />try {<br />field = clazz.getDeclaredField(name);//返回一個 Field 對象,該對象反映此 Class 對象所表示的類或介面的指定已聲明欄位。<br />}<br />catch (NoSuchFieldException nsfe) {<br />field = getField( clazz, clazz.getSuperclass(), name );<br />}<br />if ( !ReflectHelper.isPublic(clazz, field) ) field.setAccessible(true);<br />return field;<br />}</p><p>private static Field getField(Class root, Class clazz, String name) throws PropertyNotFoundException {<br />if ( clazz==null || clazz==Object.class ) {<br />throw new PropertyNotFoundException("field [" + name + "] not found on " + root.getName());<br />}<br />Field field;<br />try {<br />field = clazz.getDeclaredField(name);<br />}<br />catch (NoSuchFieldException nsfe) {<br />field = getField( root, clazz.getSuperclass(), name );<br />}<br />if ( !ReflectHelper.isPublic(clazz, field) ) field.setAccessible(true);<br />return field;<br />}</p><p>public Getter getGetter(Class theClass, String propertyName)<br />throws PropertyNotFoundException {<br />return new DirectGetter( getField(theClass, propertyName), theClass, propertyName );<br />}</p><p>public Setter getSetter(Class theClass, String propertyName)<br />throws PropertyNotFoundException {<br />return new DirectSetter( getField(theClass, propertyName), theClass, propertyName );<br />}</p><p>}<br />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.