黑马程序员——反射的实际应用

来源:互联网 发布:男士船袜淘宝 编辑:程序博客网 时间:2024/06/06 21:39

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一。应用配置文件运行类中的方法

定义一个类

public class Worker {public void show(){System.out.println("爱工作,爱生活");}}

应用反射调用方法

import java.io.FileReader;import java.lang.reflect.Constructor;import java.lang.reflect.Method;import java.util.Properties;/* * 通过配置文件运行类中的方法 分析: 首先要有类 其次要有配置文件 配置文件中应该有类名和方法名 通过Properties读取配置文件的内容 通过forname方法获取字节码文件 通过getmethod方法获取相应方法 调用执行方法 */public class ConfigFileTest {public static void main(String[] args) throws  Exception {//加载键值对数据到Properties集合FileReader fr = new FileReader("config.txt");Properties prop = new Properties();prop.load(fr);fr.close();//获取类名和方法名String className = prop.getProperty("className");String methodName = prop.getProperty("methodName");//获取类的字节码文件并创建对象Class c = Class.forName(className);Constructor con = c.getConstructor();Object obj = con.newInstance();//调用方法Method m = c.getMethod(methodName);m.invoke(obj);}}

配置文件的内容为

className=cn.itcast_test.Worker
methodName=show

如果改变配置文件的内容则调用的类和方法也就不一样了,这样就节省了很多代码,提高了代码的可处理性。

二。跳过泛型的限制给集合添加元素

import java.lang.reflect.Method;import java.util.ArrayList;/* * 我给你ArrayList<Integer>的一个对象,我想在这个集合中添加一个字符串数据,如何实现呢? 分析: 若直接使用此对象肯定是无法添加字符串数据的,那么我们可以获取此对象的字节码文件 然后通过字节码文件获取成员方法来添加数据 */public class ArrayListTest {public static void main(String[] args) throws Exception{ArrayList<Integer> al = new ArrayList<Integer>();Class c = al.getClass();//获取成员方法Method m = c.getMethod("add",Object.class);m.invoke(al, "hello");m.invoke(al, "world");m.invoke(al, "java");System.out.println(al);}}
该使用是在底层使用add方法,所以跳过了泛型的限制。

三。利用反射来设计特殊的方法

import java.lang.reflect.Field;/* * 写一个方法,public void setProperty(Object obj, String propertyName, Object value){},此方法可将obj对象中名为propertyName的属性的值设置为value。 */public class AssignmentTool {public void setProperty(Object obj,String propertyName,Object value) throws Exception{//获取字节码文件对象Class c = obj.getClass();//获取成员变量propertyNameField field = c.getDeclaredField(propertyName);//取消访问检查field.setAccessible(true);//赋值field.set(obj, value);}}



0 0
原创粉丝点击