- Published on
JAVA 反射应用
- Authors
- Name
- JiGu
- @crypto20x
什么是反射?
最简单的理解,可以将"ClassName"转换成一个真正的对象。可以动态的调用某个函数,创建某个类。 像python,php这种动态语言很容易实现,java就需要借助反射。
例子读取spring.txt中的字段,实例化类,调用方法
示例代码:
- test类
package com.hellomaven;
import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;
public class TestService {
@SuppressWarnings({"rawtypes", "unchecked"})
public static void main(String[] args) throws Exception {
File springConfigFile = new File("./src/main/java/com/hellomaven/spring.txt");
//获取配置
Properties springConfig = new Properties();
springConfig.load(new FileInputStream(springConfigFile));
String className = (String)springConfig.get("class");
String methodName = (String)springConfig.get("method");
//得到类类型
Class clazz = Class.forName(className);
//得到方法
Method m = clazz.getMethod(methodName);
//得到构造函数
Constructor c = clazz.getConstructor();
//构造一个实例,所有实例都继承自Object
Object service = c.newInstance();
//调用方法。
m.invoke(service);
}
}
- Hero类
package com.hellomaven;
public class Hero {
public static void main(String []args){
System.out.println("hello");
}
public String name;
double hp;
double mp;
static String copyright;
static {
System.out.println("初始化 copyright");
copyright = "版权由xxx公司所有";
}
public void Say(String words){
System.out.println(words);
}
public void UseQ(){
System.out.println("use q");
}
public void UseW(){
System.out.println("use w");
}
}
- spring.txt文件
class=com.hellomaven.Hero
method=UseQ