您的位置:首页 > 职场人生

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

2015-12-28 02:32 519 查看
------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();
//获取成员变量propertyName
Field field = c.getDeclaredField(propertyName);
//取消访问检查
field.setAccessible(true);
//赋值
field.set(obj, value);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 反射