
先通过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如何通过反射获取包中所有的类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)