易网时代-编程资源站
Welcome
微信登录
编程资源
图片资源库
蚂蚁家优选
PDF转换器
软件资源
软件开发
、
小程序制作
、
系统集成与运维
、
空间租用
、
硬件开发
、
视频监控
、
技术咨询与支持
——联系电话:0311-88999002/88999003
首页
/
操作系统
/
Linux
/
Java反射之操作目标类中的成员
代码说话。。
package
com.jadyer.reflection;
import
java.lang.reflect.Field;
import
java.lang.reflect.InvocationTargetException;
import
java.lang.reflect.Method;
import
com.jadyer.model.Person;
/**
* 操作目标类中的成员
*/
public
class
ProcessTargetClassMember {
public
static
void
main(String[] a)
throws
Exception{
ProcessTargetClassMember test =
new
ProcessTargetClassMember();
Person person =
new
Person(
"张起灵"
,
26
);
System.out.println(
"------------------------->>直接操作对象的属性public String name, Integer age"
);
test.processObjectField(person,
"name"
,
"陈文锦"
);
test.processObjectField(person,
"age"
,
27
);
System.out.println(person);
System.out.println(
"------------------------->>直接操作类的属性public static Integer total = 100"
);
test.processClassField(
"com.jadyer.model.Person"
,
"total"
,
88
);
System.out.println(
"------------------------->>调用对象的成员方法setAll(String name, Integer age)"
);
test.invokeObjectMethod(person,
"setAll"
,
new
Class[]{String.
class
, Integer.
class
},
new
Object[]{
"吴三省"
,
99
});
System.out.println(person);
System.out.println(
"------------------------->>调用类的成员方法showTotal()"
);
test.invokeClassMethod(
"com.jadyer.model.Person"
,
"showTotal"
,
null
,
null
);
}
/**
* 直接操作对象的属性
* @see 这些属性都必须是public的,即访问权限允许的情况下才能被使用
* @see 否则即使是反射机制,也无法直接访问它们
*/
public
void
processObjectField(Object obj, String fieldName, Object newValue)
throws
NoSuchFieldException, IllegalAccessException {
Class<?> clazz = obj.getClass();
//获取obj对象的Class对象,它所描述的就是指定类的信息
Field field = clazz.getField(fieldName);
//返回当前clazz类中特定的某一个属性
Object oldValue = field.get(obj);
//获取指定对象的属性值,其实是将fileName的属性值赋给了oldValue
System.out.println(
"修改前:"
+ fieldName +
"="
+ oldValue);
field.set(obj, newValue);
//设定对象的属性值为指定的值,即设定obj对象的fieldName的属性值为newValue
System.out.println(
"修改后:"
+ fieldName +
"="
+ field.get(obj));
}
/**
* 直接操作类的属性
* @see 由于在形参中指定了类名,所以能够直接操作类名
* @see 而processField()方法中指定的是一个对象的引用
*/
public
void
processClassField(String className, String fieldName, Object newValue)
throws
ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
Class<?> clazz = Class.forName(className);
Field field = clazz.getField(fieldName);
Object oldValue = field.get(clazz);
System.out.println(
"修改前:"
+ fieldName +
"="
+ oldValue);
field.set(clazz, newValue);
System.out.println(
"修改后:"
+ fieldName +
"="
+ field.get(clazz));
}
/**
* 调用对象的成员方法
* @param obj---------指定一个对象
* @param methodName--指定所要调用的该对象的方法名
* @param argTypes----指定方法的形参
* @param args--------给定方法的实参
*/
public
void
invokeObjectMethod(Object obj, String methodName, Class<?>[] argTypes, Object[] args)
throws
NoSuchMethodException, IllegalAccessException, InvocationTargetException {
Class<?> clazz = obj.getClass();
//获取Class对象
Method method = clazz.getMethod(methodName, argTypes);
//返回某一个特定的方法。需要指定方法名和形参列表
Object result = method.invoke(obj, args);
//调用Method对象对应的方法。若该方法没有返回值,则返回null
System.out.println(
"result:"
+ result);
}
/**
* 调用类的成员方法
*/
public
void
invokeClassMethod(String className, String methodName, Class<?>[] argTypes, Object[] args)
throws
ClassNotFoundException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Class<?> clazz = Class.forName(className);
Method method = clazz.getMethod(methodName, argTypes);
Object result = method.invoke(
null
, args);
System.out.println(
"result:"
+ result);
}
}
下面是用到的Person类
package
com.jadyer.model;
public
class
Person {
public
String name;
public
Integer age;
public
static
Integer total =
100
;
public
Person() {
total++;
}
public
Person(String name, Integer age) {
this
.name = name;
this
.age = age;
total++;
}
public
void
setAll(String name, Integer age){
this
.name = name;
this
.age = age;
}
public
static
Integer showTotal(){
System.out.println(
"total="
+ total);
return
total;
}
@Override
public
String toString() {
return
"Name:"
+ name +
" Age:"
+ age;
}
}
收藏该网址
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图