Method M= Class.getMethod("MN", class);
Object obj = M.invoke(Object, parm);
class 返回类型
MN 方法名
M 方法对象
Object 方法MN 所在对象
parm MN 的参数
反射getMethod()调用类方法时,发生 NoSuchMethodException异常,后来上网发现getMethod()调用公共方法,不能反射调用私有方法,后来找到 getDeclaredField()能够访问本类中定义的所有方法。
1、根据对象获得所有字段的值
public static void method(Object obj) {
try {
Class clazz = obj.getClass();
Field[] fields = obj.getClass().getDeclaredFields();//获得属性
for (Field field : fields) {
PropertyDescriptor pd = new PropertyDescriptor(field.getName(),
clazz);
Method getMethod = pd.getReadMethod();//获得get方法
Object o = getMethod.invoke(obj);//执行get方法返回一个Object
System.out.println(o);
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IntrospectionException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
2、通过对象和具体的字段名字获得字段的值
public static void method(Object obj, String filed) {
try {
Class clazz = obj.getClass();
PropertyDescriptor pd = new PropertyDescriptor(filed, clazz);
Method getMethod = pd.getReadMethod();//获得get方法
if (pd != null) {
Object o = getMethod.invoke(obj);//执行get方法返回一个Object
System.out.println(o);
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IntrospectionException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
- java中遍历实体类属性和类型,并赋值和获取值
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
/**
* 获取实体类型的属性名和类型
*
* @author kou
*/
public class GetModelNameAndType
{
public static void testReflect(Object model) throws SecurityException,
NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException, InstantiationException
{
// 获取实体类的所有属性,返回Field数组
Field[] field = model.getClass().getDeclaredFields();
// 获取属性的名字
String[] modelName = new String[field.length];
String[] modelType = new String[field.length];
for (int i = 0; i < field.length; i++)
{
// 获取属性的名字
String name = field[i].getName();
modelName[i] = name;
// 获取属性类型
String type = field[i].getGenericType().toString();
modelType[i] = type;
//关键。。。可访问私有变量
field[i].setAccessible(true);
//给属性设置
field[i].set(model, field[i].getType().getConstructor(field[i].getType()).newInstance("kou"));
// 将属性的首字母大写
name = name.replaceFirst(name.substring(0, 1), name.substring(0, 1)
.toUpperCase());
if (type.equals("class java.lang.String"))
{
// 如果type是类类型,则前面包含"class ",后面跟类名
Method m = model.getClass().getMethod("get" + name);
// 调用getter方法获取属性值
String value = (String) m.invoke(model);
if (value != null)
{
System.out.println("attribute value:" + value);
}
}
if (type.equals("class java.lang.Integer"))
{
Method m = model.getClass().getMethod("get" + name);
Integer value = (Integer) m.invoke(model);
if (value != null)
{
System.out.println("attribute value:" + value);
}
}
if (type.equals("class java.lang.Short"))
{
Method m = model.getClass().getMethod("get" + name);
Short value = (Short) m.invoke(model);
if (value != null)
{
System.out.println("attribute value:" + value);
}
}
if (type.equals("class java.lang.Double"))
{
Method m = model.getClass().getMethod("get" + name);
Double value = (Double) m.invoke(model);
if (value != null)
{
System.out.println("attribute value:" + value);
}
}
if (type.equals("class java.lang.Boolean"))
{
Method m = model.getClass().getMethod("get" + name);
Boolean value = (Boolean) m.invoke(model);
if (value != null)
{
System.out.println("attribute value:" + value);
}
}
if (type.equals("class java.util.Date"))
{
Method m = model.getClass().getMethod("get" + name);
Date value = (Date) m.invoke(model);
if (value != null)
{
System.out.println("attribute value:"
+ value.toLocaleString());
}
}
}
}
public static void main(String[] args)
{
try
{
testReflect(new VO());
}
catch (SecurityException e)
{
e.printStackTrace();
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
catch (NoSuchMethodException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
catch (InvocationTargetException e)
{
e.printStackTrace();
}
catch (InstantiationException e)
{
e.printStackTrace();
}
}
}
getDeclaredMethod ,getDeclaredMethods等的区别
Method getDeclaredMethod(String name, Class… parameterTypes)
返回 当前类(不包括继承)的公共、保护、默认(包)访问和私有方法 name为方法名,parameterTypes为参数对应的类型。
Method[] getDeclaredMethods()
返回 当前类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
getDeclaredField(String name)
返回 当前类或接口声明的所有属性,包括公共、保护、默认(包)访问和私有方法,但不包括继承的属性。
Method getMethod(String name, Class… parameterTypes)
返回 包括继承方法在内的某个公共方法(保护、默认(包)访问和私有方法均不返回) name为方法名,parameterTypes为参数对应的类型
Method[] getMethods()
返回 包括继承方法在内的所有公共方法(保护、默认(包)访问和私有方法均不返回)
Field[] getDeclaredFields()
返回 包括继承方法在内的所有公共属性(保护、默认(包)访问和私有方法均不返回)