Java版《我的世界》Forge反射找不到私有方法和属性名是什么原因

Java版《我的世界》Forge反射找不到私有方法和属性名是什么原因,第1张

先通过IO,定位到这个包

通过Filelist得到一个包含这个包下所有class的文件的数组。

循环这个数组,用包名拼接每一个遍历出来的文件的名字,得到每一个完整的类名(即,包名加类名)

通过classforname反射得到每一个类实例

    public class ReflectDemo

    {

        public static void Main(string[] args)

        {

            // 正常方式创建对象和给属性赋值

            C c = new C();

            cN = "helloworld";

            // 正常方式赋值

            ConsoleWriteLine("正常方式赋值:");

            ConsoleWriteLine(cN);

            // 全反射方式

            var type = typeof(C);

            object obj = ActivatorCreateInstance(type);

            // 属性赋值            

            PropertyInfo pInfo = typeGetProperty("N");

            if (pInfo != null)

            {

                pInfoSetValue(obj, "helloworld", null);

                // 测试是否已经属性赋值。

                ConsoleWriteLine("测试是否已经属性赋值:");

                ConsoleWriteLine(((C)obj)N); 

                // 用反射方式获取属性的值

                ConsoleWriteLine("用反射方式获取属性的值:");

                ConsoleWriteLine(pInfoGetValue(obj, null)); 

            }

            ConsoleRead();

        }

    }

C类代码如下:

    public class C

    {

        private string n;

        public string N

        {

            get { return n; }

            set { n = value; }

        }

    }

for (int i = 0; i < fieldslength; i++) {

Field field = fields[i];

String fieldName = fieldgetName();

Systemoutprintln("name====="+fieldName);

String firstLetter = fieldNamesubstring(0, 1)toUpperCase();

// 获得和属性对应的getXXX()方法的名字

String getMethodName = "get" + firstLetter + fieldNamesubstring(1);

// 获得和属性对应的getXXX()方法

Method getMethod = classTypegetMethod(getMethodName, new Class[]{});

// 调用原对象的getXXX()方法

Object value = getMethodinvoke(object, new Object[]{});

Systemoutprintln("value===="+value);

}

1、Test t = new Test()Class clazz = tgetClass()Systemoutprintln(clazzgetCanonicalName())Systemoutprintln(clazzgetSimpleName())

2、public class TestReflect {public static void main(String[] args) throws Exception {TestReflect testReflect = new TestReflect()Systemoutprintln(testReflectgetClass()getName())// 结果 netxsoftlabbaikeTestReflect}}

3、Java程序

先获取Method对象

以下仅供参考

package comkiddtestzhidao;

import javalangreflectMethod;

/

  Hello world!

 

 /

public class Main {

    public static void main(String[] args) {

        Method method1 = null;

        Method method2 = null;

        try {

            method1 = ClassforName("comkiddtestzhidaoCat")getMethod("getName", (Class<>[]) null);

            method2 = ClassforName("comkiddtestzhidaoCat")getMethod("getChilds", (Class<>[]) null);

        } catch (NoSuchMethodException ex) {

            exprintStackTrace();

        } catch (SecurityException ex) {

            exprintStackTrace();

        } catch (ClassNotFoundException ex) {

            exprintStackTrace();

        }

        if (null != method1) {

            Systemoutprintln(method1getGenericReturnType()getTypeName());

        }

        if (null != method2) {

            Systemoutprintln(method2getGenericReturnType()getTypeName());

        }

    }

}

class Cat {

    private String name;

    private Cat[] childs;

    public String getName() {

        return name;

    }

    public void setName(String name) {

        thisname = name;

    }

    public Cat[] getChilds() {

        return childs;

    }

    public void setChilds(Cat[] childs) {

        thischilds = childs;

    }

}

MeatObject是Mybatis的工具类,通过MetaObject获取和设置对象的属性值。

返回结果:

基本的pojo对象:

MetaObject提供了一个工具类:

当调用 SystemMetaObject 获取 MetaObject 对象时,每次均 new DefaultReflectorFactory() 了一个反射工厂类。

继续查看:

这个类并没有做很复杂的 *** 作,就是获取object的type类型,且存储到Map中。当同一个object调用 forObject() 时,后续调用可以在缓存中获取反射对象。

但注意: SystemMetaObject 方法因为每次均new了一个新的 DefaultReflectorFactory 工厂。若每次在方法中调用 SystemMetaObjectforObject 获取 MetaObject 对象。同一个对象可能不会走缓存。

推荐做法: 将 DefaultReflectorFactory 声明为静态变量:

在创建 MetaObject 对象的时候,就会将传入的Object对象的所有反射对象都缓存起来。后续调用 metaObjectsetValue 等方法时,直接在缓存中获取到反射对象,然后执行反射 *** 作。

创建MetaObject对象时,选择不同的Wrapper进行包装。

以普通的pojo为例,创建 BeanWrapper 对象,在 forClass 方法中会遍历object的所有方法。获取反射对象。

到此处:

到达此处,判断 缓存 中是否存在某对象的解析结果:

注意: MetaObjectforObject 会将object结果缓存起来,后续在使用MetaObjectforObject创建对象时,直接在缓存中获取。

若没有存在,则调用 new Reflector(type); 去创建cache对象。

总方法:

2 删除方法的前缀,获取属性名:

3 key为属性名,value是集合:

4 将局部变量放入到属性集合中:

5 放入到属性变量中

设置分词器:

>

以上就是关于Java版《我的世界》Forge反射找不到私有方法和属性名是什么原因全部的内容,包括:Java版《我的世界》Forge反射找不到私有方法和属性名是什么原因、Java反射设置私有属性和获取属性、java如何通过反射获取包中所有的类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/9282975.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存