开发的时候有时候会碰到这样的情况,我们在写程序的时候并不知道需要调用某个对象的哪个方法,只有程序运行后,我们才能够知道。或许我们需要根据客户端传过来的某个String参数的值来判断我们应该执行哪个方法。在这种情况下JAVA的反射执行就可以帮上忙了。下面是我做的一个简单的测试代码,提供给大家做个参考。
import javalangreflectInvocationTargetException;
import javalangreflectMethod;
/ //
@author Dong
测试JAVA reflect机制
/
public class TestRef{
/ //
@param args
/
public static void main(String[] args){
TestBean test = new TestBean();
Method[] methods = testgetClass()getMethods();
testsetAbc("---");
for(int i=0;i<methodslength;i++){
if(methods[i]getName()equalsIgnoreCase("getabc")){
try {
Systemoutprintln(methods[i]invoke(test));
} catch (IllegalArgumentException e) {
eprintStackTrace();
} catch (IllegalAccessException e) {
eprintStackTrace();
} catch (InvocationTargetException e) {
eprintStackTrace();
}
}
}
}
}
获得一个类中的方法
先看一下方法和运行结果。获取所有的方法使用Class类中getMethos()方法。
待获取的类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package comaaronreflect;
public class Heros {
private String name;//名字
private String type;//类型
private int camp;//0,近卫;1,天灾
public Heros(){}
public Heros(String name, String type, int camp) {
super();
thisname = name;
thistype = type;
thiscamp = camp;
}
public String getName() {
return name;
}
public void setName(String name) {
thisname = name;
}
public String getType() {
return type;
}
public void setType(String type) {
thistype = type;
}
public int getCamp() {
return camp;
}
public void setCamp(int camp) {
thiscamp = camp;
}
@Override
public String toString() {
return "Heros [\n name=" + name + ", \n type=" + type + ", \n camp=" + camp + "\n]";
}
}
Hero类中包含了三个属性,和对应的getter和setter方法。另外还有一个toString方法。这是一个非常常见的pojo。
测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
package comaaronreflect;
import javalangreflectMethod;
public class Demo5 {
public static void main(String[] args) {
Class<> herosClass = Herosclass;
Method[] methods = herosClassgetMethods();
for (Method method : methods) {
Systemoutprintln(method);
}
}
}
理论上,我们会获得所有的getter和setter,然后还有toString方法
运行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void comaaronreflectHerossetType(javalangString)
public int comaaronreflectHerosgetCamp()
public void comaaronreflectHerossetCamp(int)
public javalangString comaaronreflectHerostoString()
public javalangString comaaronreflectHerosgetName()
public void comaaronreflectHerossetName(javalangString)
public javalangString comaaronreflectHerosgetType()
public final void javalangObjectwait(long,int) throws javalangInterruptedException
public final native void javalangObjectwait(long) throws javalangInterruptedException
public final void javalangObjectwait() throws javalangInterruptedException
public boolean javalangObjectequals(javalangObject)
public native int javalangObjecthashCode()
public final native javalangClass javalangObjectgetClass()
public final native void javalangObjectnotify()
public final native void javalangObjectnotifyAll()
然而却列出了这么一大堆。
仔细看一下返回的方法,原来把Object类所拥有的方法也返回了。因为我们这个POJO类默认继承的是javalangObject类。,例如getClass(),equals()这些。
使用getMethods()这个方法,返回了一个包含某些Method对象的数组,Method对象已经介绍过,用来表示一个方法的对象,是对类中方法进行抽象的结果。
这些对象反映了Class对象所表示的类或者接口,当然,包括那些由该类或者接口声明的以及从超类和超接口继承的那些类或接口。举个例子来解释一下:
例如使用getMethods()获得Integer类的方法,会把Integer的父类,Number的所有方法,以及Number的父类Object的方法都获取出来。
这个返回数组,包括了从Object类继承的所有(公共)member方法。返回数组中的元素没有排序。如果这个Class对象表示没有公共成员方法的类或者接口,或者表示了一个基本类型或者表示void,则返回长度为0的数组。
2,调用类中的方法
直接给出一个Demo,注意参数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package comaaronreflect;
import javalangreflectInvocationTargetException;
import javalangreflectMethod;
public class Demo5 {
public static void main(String[] args) {
Class<> herosClass = Herosclass;
try {
Method m1 = herosClassgetMethod("setName",Stringclass);
Method m2 = herosClassgetMethod("getName");
Object userInfo = herosClassnewInstance();
m1invoke(userInfo,"影魔");
Systemoutprintln("调用set方法:"+userInfo);
Systemoutprintln("调用get方法:"+m2invoke(userInfo));
} catch (Exception e) {
eprintStackTrace();
}
}
}
运行结果:
1
2
3
4
5
6
7
8
调用set方法:
Heros [
name=影魔,
type=null,
camp=0
]
调用get方法:
影魔
Class<> clazz = refgetClass();
Method method=clazzgetMethod("getLength");
Systemoutprintln(methodinvoke(ref));
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
thisname = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
thisage = age;
}
public static void main(String[] args) {
try {
Class c = ClassforName(PersonclassgetName());
//获取类的属性
Field[] fields = cgetDeclaredFields();
for (int i = 0; i < fieldslength; i++) {
Systemoutprintln("类的属性有:"+ ModifiertoString(fields[i]getModifiers())+" "+fields[i]getType()+" "+fields[i]getName());
}
//获取类的方法
Method[] methods= cgetMethods();
for (int j = 0; j <methodslength ; j++) {
Systemoutprintln("类的方法有:"+ModifiertoString(methods[j]getModifiers())+" "+methods[j]getReturnType()+" "+methods[j]getName());
}
} catch (ClassNotFoundException e) {
eprintStackTrace();
}
}
}
//运行结果如下:
类的属性有:private class javalangString name
类的属性有:private int age
类的方法有:public static void main
类的方法有:public class javalangString getName
类的方法有:public void setName
类的方法有:public void setAge
类的方法有:public int getAge
类的方法有:public final void wait
类的方法有:public final void wait
类的方法有:public final native void wait
类的方法有:public boolean equals
类的方法有:public class javalangString toString
类的方法有:public native int hashCode
类的方法有:public final native class javalangClass getClass
类的方法有:public final native void notify
类的方法有:public final native void notifyAll
Class<> clazz = objectgetClass();
Method[] ms = clazzgetMethods();
for (int i = 0; i < mslength; i++) {
Systemoutprintln("方法名:"+ms[i]getName());
Type[] t = ms[i]getGenericParameterTypes();//获取参数类型,至于你说的获取参数值,我没明白
}
以上就是关于java反射怎么得到正在运行的游戏里的数据全部的内容,包括:java反射怎么得到正在运行的游戏里的数据、用java的反射机制怎么获取一个类中里面方法、java怎么通过反射获得所有的属性的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)