java如何动态修改一个对象的类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java如何动态修改一个对象的类型相关的知识,希望对你有一定的参考价值。
类test.Test内容如下
public class Testpublic String name="222";
public static void main(String[] args)
Class typ = Class.forName("test.Test");
Object obj = typ.newInstance();
Field field = typ.getField("name");
field.set(obj, 111);
现在又这样一个对象,就是通过反射创建一个Test对象
最后一行会执行失败,因为类型不符
目前希望实现一个功能,就是能够读取field的类型,并将111转换成指定的类型
想完成下面的方法如何写呢
public void changeType(Object obj, Class typ)
把对象obj转换成typ指定的类型
我的意思就是反射创建一个对象,然后从Xml中读取数据给对象初始化,读出来的都是String类型,可是不知道如何进行类型转换,比如读到true,也知道目标字段类型
我有一种想法:
Object obj = 5;
public Object changeType(Object s, Class type)
Method method = type.getMethod("valueOf", s.getClass());
return method.invoke(type, s);
我想这样,可是怎么就不行呢
changeType("asdg", obj.getClass());
这样调用怎么也不对,说没有valueOf方法,可是String类里面分明有valueOf方法
怎么回事呢
另外,假通过反射强制类型转换 怎么用类型变量去引用呢 还只能用Object 。 反射能动态获得对象类型及属性参数 行了追问
麻烦帮忙看下补充
追答热,String里面却是有valueOf的静态方法,但是你要看清楚,你的参数是都是正确的,valueOf后面都是值类型,没有String类型,当然提示你找不到这个方法了,
method=demo.getMethod("valueOf", int.class);
method.invoke(demo.newInstance(),1);
这样就可以,
我知道,valueOf都是值类型
而我要取的是int的啊
下面代码就会出错
Object str = "1";
Object int1 = 1;
Method method = str.getClass().getMethod("valueOf", int1.getClass());
你知道valueOf都是值类型,为什么这里你要放一个Object进去?
Object int1 = 1; ("valueOf", int1.getClass()); ???
你打印一下int1.getClass()这个值是这个java.lang.Integer,
应用对象,如参不匹配,就对不上方法了。
method=demo.getMethod("valueOf", int.class); 写成这样就OK。
关键是int都从filed中取得的,必然是一个object
追答JAVA自动装拆箱,参数类型对了就OK,你懂的。
参考技术A楼主可以换种思路来实现:对于不同的类型,设置不同的参数,如下:
String typeName = type.getName();String value = "1";
if(typeName.indexOf("int") != -1)
field.set(obj, Integer.valueOf(value));
else if(typeName.indexOf("String") != -1)
field.set(obj, value);
else if(typeName.indexOf("其他类型") != -1)
field.set(obj, "类型转换");
追问
麻烦帮忙看下补充
参考技术B 直接类型强转就行了,没有继承关系的类是不可能互转的追问强制转不行的
参考技术C typ是一个类对象,时test对应的类的类对象,你确定要把obj装换成类对象对应的类吗?追问麻烦帮忙看下补充
Java核心技术类型信息(Class对象 反射 动态代理)
- 加载:由类加载器完成,找到对应的字节码,创建一个Class对象
- 链接:验证类中的字节码,为静态域分配空间
- 初始化:如果该类有超类,则对其初始化,执行静态初始化器和静态初始化块
public class Base { static int num = 1; static { System.out.println("Base " + num); } } public class Main { public static void main(String[] args) { // 不会初始化静态块 Class clazz1 = Base.class; System.out.println("------"); // 会初始化 Class clazz2 = Class.forName("zzz.Base"); } }
class Base { } class Derived extends Base { } public class Main { public static void main(String[] args) { Base base = new Derived(); if (base instanceof Derived) { // 这里可以向下转换了 System.out.println("ok"); } else { System.out.println("not ok"); } } }
class Base { } class Derived extends Base { } public class Main { public static void main(String[] args) { Base base = new Derived(); if (base instanceof Derived) { // 这里可以向下转换了 System.out.println("ok"); } else { System.out.println("not ok"); } } }
public interface Hello { void doSomething(); } public class HelloImpl implements Hello { @Override public void doSomething() { System.out.println("HelloImpl doSomething"); } } /** * 代理类 */ public class ProxyHandler implements InvocationHandler { private Object proxyed; public ProxyHandler(Object proxy) { proxyed = proxy; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException { System.out.println("proxy working"); return method.invoke(proxyed, args); } } public static void main(String[] args) { Hello hello = new HelloImpl(); Hello proxy = (Hello) Proxy.newProxyInstance(Hello.class.getClassLoader(), new Class[]{Hello.class}, new ProxyHandler(hello)); proxy.doSomething(); }
输出结果:
以上是关于java如何动态修改一个对象的类型的主要内容,如果未能解决你的问题,请参考以下文章