我想在不使用setter的情况下向Object变量插入值.怎么可能.
这是一个例子
- Class X{
- String variableName;
- // getters and setters
- }
现在我有一个函数,它包含变量名,要设置的值和Class X的Object.
我试图使用泛型方法将值设置为Object(objectOfClass),并在相应的变量(variableName)中传递值i(valueToBeSet).
- Object functionName(String variableName,Object valueToBeSet,Object objectOfClass){
- //I want to do the exact same thing as it does when setting the value using the below statement
- //objectOfClass.setX(valueToBeSet);
- return objectOfClass;
- }
解决方法
此代码未经过测试.你可以试试这个.
要导入的类
- import java.beans.BeanInfo;
- import java.beans.IntrospectionException;
- import java.beans.Introspector;
- import java.beans.PropertyDescriptor;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- public Object functionName(String variableName,Object objectOfClass) throws IntrospectionException,NoSuchMethodException,SecurityException,IllegalAccessException,IllegalArgumentException,InvocationTargetException{
- //I want to do the exact same thing as it does when setting the value using the below statement
- //objectOfClass.setX(valueToBeSet);
- Class clazz = objectOfClass.getClass();
- BeanInfo beanInfo = Introspector.getBeanInfo(clazz,Object.class); // get bean info
- PropertyDescriptor[] props = beanInfo.getPropertyDescriptors(); // gets all info about all properties of the class.
- for (PropertyDescriptor descriptor : props) {
- String property = descriptor.getDisplayName();
- if(property.equals(variableName)) {
- String setter = descriptor.getWriteMethod().getName();
- Class parameterType = descriptor.getPropertyType();
- Method setterMethod = clazz.getDeclaredMethod(setter,parameterType); //Using Method Reflection
- setterMethod.invoke(objectOfClass,valueToBeSet);
- }
- }
- return objectOfClass;
- }