java反射怎么得到正在运行的游戏里的数据

java反射怎么得到正在运行的游戏里的数据,第1张

开发的时候有时候会碰到这样的情况,我们在写程序的时候并不知道需要调用某个对象的哪个方法,只有程序运行后,我们才能够知道。或许我们需要根据客户端传过来的某个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怎么通过反射获得所有的属性的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9449555.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存