When create a GUI class I’m find a problem of access to the variables in another class using a universal procedure. Here is my solution to the problem 🙂
package testexample; import java.lang.reflect.Field; class S3Element { private Object obj=null; private Field fld=null; private String fieldName=""; /** * * @param obj - A reference object to override * @param fieldName - field name to modify the variable */ public S3Element(Object obj, String fieldName){ this.obj=obj; this.fieldName=fieldName; this.fld=findField(obj, fieldName); } private static Field findField(Object genericObject, String filedName){ if (genericObject != null){ Field[] declaredFields=genericObject.getClass().getDeclaredFields(); for (int i=0; i < declaredFields.length; i++){ Field field=declaredFields[i]; if (field.getName().equals(filedName)){ field.setAccessible(true); return field; } } return findField((Class) genericObject.getClass().getGenericSuperclass(), filedName); } throw new RuntimeException("No find field: " + filedName); } /** * Setting a new field value * * @param value */ public void setValue(Object value){ try { System.out.println("setValue for field: " + fieldName + " in object " + obj.getClass().getName() + " to " + value.toString()); fld.set(obj, value); } catch (Exception e) { throw new RuntimeException("Error setValue for field: " + fieldName + " in object" + obj.getClass().getName(), e); } } /** * * @return */ public Object getValue(){ try { return fld.get(obj); } catch (Exception e) { throw new RuntimeException("Error getValue for field: " + fieldName + " in object" + obj.getClass().getName(), e); } } } class Test { public float testFloat=2f; public int testInteger=100; public void run(){ S3Element el=new S3Element(this, "testFloat"); System.out.println(" testFloat: " + testFloat); el.setValue(10f); System.out.println(" testFloat: " + testFloat); el.setValue(20f); System.out.println(" testFloat: " + testFloat); el.setValue(30f); System.out.println(" testFloat: " + testFloat); el=new S3Element(this, "testInteger"); System.out.println(" testInteger: " + testInteger); el.setValue(10); System.out.println(" testInteger: " + testInteger); el.setValue(20); System.out.println(" testInteger: " + testInteger); el.setValue(30); System.out.println(" testInteger: " + testInteger); } } public class TestExample { public static void main(String[] args){ Test tst=new Test(); tst.run(); } } |
Możliwość komentowania jest wyłączona.