---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
反射2
反射的method类的用法:
Object invoke(Object obj, Object... args)
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。
如果调用方法时,传递进去的参数是个数组,那么需要先对数组进行装包即:
new Object[]{new Type[]{...}}
publicclass ReflectDemo3
{
publicstaticvoid main(String[] args) throws Exception
{
//创建字符串对象
String str = "lsk";
//获得str对象的charAt方法
Method m = str.getClass().getMethod("charAt", int.class);
//调用charAt方法
System.out.println(m.invoke(str, 2));
System.out.println(m.invoke(str, new Object[]{1}));
}
}
既然反射有method方法来调用对象的方法,那么能不能调用某个对象的main方法呢?下面举例说明:
class Test
{
publicstaticvoid main(String[] args)
{
for(String arg : args)
{
System.out.println(arg);
}
}
}
这个Test类是个独立的类,用自己的静态main方法,方法体是输出传递进来的参数字符串数组。下面在另一个类中通过反射调用该main方法:
//Test类的位置
String testmain = "Newtechnology.Test";
Method mainmethod = Class.forName(testmain).getMethod("main", String[].class);
//一下两种字符串数组的传递方式都能成功
mainmethod.invoke(null, new Object[]{new String[]{"123","456","789"}});
mainmethod.invoke(null, (Object)new String[]{"123","456","789"});
下面是反射应用的例子:
1、将某类中的String类型的字段中的值中的‘w’字符转变成‘m’
该方法接收的Object是某类的实例对象
publicstaticvoid change(Object obj) throws Exception
{
//获得obj对象的字段数组
Field[] fields = obj.getClass().getFields();
//遍历fields数组
for(Field f : fields)
{
if(f.getType()==String.class)
{
String str = (String) f.get(obj);
String str1 = str.replace('w', 'm');
//将f字段在obj上的值设置为str1
f.set(obj, str1);
}
}
System.out.println(obj.toString());
}
2、利用反射获得数组对象的各个值
publicstaticvoid printarr(Object obj)
{
//获得数组对象的Class类
Class c = obj.getClass();
//如果对象是数组就把数组的每个值输出
if(c.isArray())
{
int len = Array.getLength(obj);
for(int i =0;i<len;i++)
{
System.out.println(Array.get(obj, i));
}
}
else
System.out.println(obj.toString());
}
下面这个例子是反射与配置文件结合使用的例子,这种方式在我们以后的编程中用的机会很大,比如,Struts这种框架内部调用配置文件使用的也是类似的方式。
publicclass ReflectDemo4 {
publicstaticvoid main(String[] args) throws Exception
{
//流方式加载配置文件
//InputStream is = new FileInputStream("config.properties");
//类加载器加载配置文件
//InputStream is = ReflectDemo4.class.getClassLoader().getResourceAsStream("Newtechnology/config.properties");
InputStream is = ReflectDemo4.class.getResourceAsStream("/config.properties");
//定义一个属性对象
Properties prop = new Properties();
//属性对象加载配置文件
prop.load(is);
//关闭配置文件的输入流
is.close();
//获得配置文件中的关键字
String className = prop.getProperty("className");
//使用获得的关键字的值利用反射创建类
Constructor cons = Class.forName(className).getConstructor(null);
Collection col = (Collection) cons.newInstance(null);
//实例化reflect对象多个
reflect r1 = new reflect1(2, 2);
reflect r2 = new reflect1(3, 4);
reflect r3 = new reflect1(3, 2);
reflect r4 = new reflect1(3, 4);
//将reflect对象放入指定类型的集合
col.add(r1);
col.add(r2);
col.add(r3);
col.add(r4);
//输出集合中对象的个数
System.out.println(col.size());
}
}
---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------