‘壹’ 大佬告诉我java 反射如何获取成员变量的值
下例演示了通过反射获取 Test 类对象 t 的 iVal, strVal 成员变量的值:
importjava.lang.reflect.Field;
classTest{
privateintiVal;
privateStringstrVal;
publicTest(intiVal,StringstrVal){
this.iVal=iVal;
this.strVal=strVal;
}
}
publicclassApp{
publicstaticvoidmain(String[]args){
//创建一个Test对象
Testt=newTest(123,"Hello");
//获取对象t的Class
Class<?>tt=t.getClass();
try{
//获取Test类的iVal字段Field
Fieldfield=tt.getDeclaredField("iVal");
//设置可访问
field.setAccessible(true);
//获取iVal的值
intval=field.getInt(t);
System.out.println(val);
FieldstrValField=tt.getDeclaredField("strVal");
strValField.setAccessible(true);
StringstrVal=(String)strValField.get(t);
System.out.println(strVal);
}catch(NoSuchFieldException|SecurityExceptione){
e.printStackTrace();
}catch(IllegalArgumentExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}
}
}
‘贰’ 用java的反射机制怎么获取一个类中里面方法中局部变量
publicclassPerson{
privateStringname;
privateintage;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicstaticvoidmain(String[]args){
try{
Classc=Class.forName(Person.class.getName());
//获取类的属性
Field[]fields=c.getDeclaredFields();
for(inti=0;i<fields.length;i++){
System.out.println("类的属性有:"+Modifier.toString(fields[i].getModifiers())+""+fields[i].getType()+""+fields[i].getName());
}
//获取类的方法
Method[]methods=c.getMethods();
for(intj=0;j<methods.length;j++){
System.out.println("类的方法有:"+Modifier.toString(methods[j].getModifiers())+""+methods[j].getReturnType()+""+methods[j].getName());
}
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}
}
}
//运行结果如下:
类的属性有:privateclassjava.lang.Stringname
类的属性有:privateintage
类的方法有:publicstaticvoidmain
类的方法有:publicclassjava.lang.StringgetName
类的方法有:publicvoidsetName
类的方法有:publicvoidsetAge
类的方法有:publicintgetAge
类的方法有:publicfinalvoidwait
类的方法有:publicfinalvoidwait
类的方法有:publicfinalnativevoidwait
类的方法有:publicbooleanequals
类的方法有:publicclassjava.lang.StringtoString
类的方法有:publicnativeinthashCode
类的方法有:publicfinalnativeclassjava.lang.ClassgetClass
类的方法有:publicfinalnativevoidnotify
类的方法有:
‘叁’ 如何利用java反射顺序的从一个java类中得到其中定义的成员变量名或者方法
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
System.out.println("name====="+fieldName);
String firstLetter = fieldName.substring(0, 1).toUpperCase();
// 获得和属性对应的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1);
// 获得和属性对应的getXXX()方法
Method getMethod = classType.getMethod(getMethodName, new Class[]{});
// 调用原对象的getXXX()方法
Object value = getMethod.invoke(object, new Object[]{});
System.out.println("value===="+value);
}
‘肆’ java如何利用反射机制得到一个类中为数组类型的成员变量的值
写了个例子,请仔细查看代码,具体过程需要你自己对照java API 再研究,
先定义了一个普通的学生类,如下:
publicclassStudent{
privateintid;
privateStringname;
privateintage;
privateString[]aiHao;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicString[]getAiHao(){
returnaiHao;
}
publicvoidsetAiHao(String[]aiHao){
this.aiHao=aiHao;
}
}
对学生类进行反射
publicclassTest3{
publicstaticvoidmain(String[]args){
Students=newStudent();
s.setId(1);
s.setName("张三");
s.setAge(23);
s.setAiHao(newString[]{"足球","篮球","上网"});
try{
//获取所有的变量
Field[]fields=Student.class.getDeclaredFields();
//循环处理变量
for(Fieldf:fields){
f.setAccessible(true);
Objectvalue=f.get(s);//取变量的值
System.out.print("变量名称为:"+f.getName());
if(value.getClass().isArray()){//判断是否是数组
Object[]arr=(Object[])value;//装换成数组
System.out.println(",变量值等于:"+Arrays.toString(arr));
//这里还可以做额外处理,判断数组的类型如下面注释的代码
/*
for(Objecta:arr){
System.out.println("参数类型"+a.getClass().getName());
//同样运用反射的机制做额外处理
}
*/
}else{
//非数组类型,普通处理
System.out.println(",变量值等于:"+value);
}
f.setAccessible(false);
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
‘伍’ 在JAVA中,怎么利用反射获取一个方法
java的反射用法:(异常请自行处理)
①找到类:Class cl = Class.forName("java.util.Date");
②创建对象(要求这个类中含有空参数的构造方法):Object obj = cl.newInstence();
③根据名称和参数找方法:Method method1 = cl.getMethod("getTime");//如果没有参数不用写第二个参数如果有参数的如:Method method2 = cl.getMethod("setTime",long.class);
④在某个对象上面执行方法,Object result = method1.invoke(obj);//如果有参数的Object result = method2.invoke(obj,21317362721);
执行的方如果有返回值,将返回值返回,否则返回null