首先用 Class.forName(完整类名)获得一个Class对象clazz,然后调用Class对象clazz的newInstance()方法得到一个对象。例如:
package kown.reflectpublic class ReflectTest
{
public static void main(String[] args)
{
try
{
Class<?> clazz = Class.forName("kown.reflect.Show")
Show show = (Show) clazz.newInstance()
show.test()
} catch (ClassNotFoundException e)
{
e.printStackTrace()
} catch (InstantiationException e)
{
e.printStackTrace()
} catch (IllegalAccessException e)
{
e.printStackTrace()
}
}
}
class Show
{
public void test()
{
System.out.println("hello world!")
}
}
其中"kown.reflect.Show"是完整类名,就是包名加类的名字。
Java无法动态添加方法和属性。Java是一门编译性的语言,常见脚本语言是解析性语言。
编译性语言的类的成员与属性在代码编译完成后就已经固定了,无法动态添加;
解释性语言是在运行时可以动态为对象添加属性和方法。
/*** 根据传入的类名和值,动态构造该类的实例
*
* @param _sClassName
*要构造的类名 如:java.lang.String
* @param _sRealValue
*要创建的对象的值,比如“wuguowei”
* @return 返回String对象,即值为“wuguowei”的字符串
* @throws Exception
*/
private Object getAttributeObject(String _sClassName, String _sRealValue)
throws Exception {
//1.加载类对象
Class attrObjClass = Class.forName(_sClassName)
//2.如果是Long类
if (attrObjClass.isInstance(new Long(0))) {
return new Long(_sRealValue)
}
//3.如果是Integer类
if (attrObjClass.isInstance(new Integer(0))) {
return new Integer(_sRealValue)
}
//4.其他类型……
//5.返回当前类的实例对象
return attrObjClass
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)