一、实例目标
根据传入的完整类名字符串类名,实现创建对应类的实例
根据传入的类实例,以及传入的方法名字符串,实现动态调用指定的方法,返回方法的返回值
在 FanSheTest 单元测试中实现使用FanShe类传入"cn.com.rwq.test.Entity"字符串实现创建Entity类,并且根据传入的字符串动态调用类中的与字符串同名的方法
二、代码
1、测试类
package cn.com.rwq.test;
import junit.framework.TestCase;
public class FanSheTest extends TestCase {
private FanShe fanShe ;
@Override
protected void setUp() throws Exception {
super.setUp();
fanShe = new FanShe() ;
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void testCreateClass() throws Exception{
Object object = fanShe.createClass("cn.com.rwq.test.Entity");
assertNotNull(object);
Common common = (Common)object;
assertEquals("123456789", common.getName());
assertEquals("12345678", ((Entity)object).toString());
}
public void testCreateObject() throws Exception{
Object object = fanShe.createClass("cn.com.rwq.test.Entity");
fanShe.createObject(object, "print");
// fanShe.createObject(object, "two");
// strPrint
// fanShe.createObject(object, "siyou");
String a =(String)fanShe.createObject(object, "strPrint");
assertEquals("abs", a);
int b =(int)fanShe.createObject(object, "intPrint");
assertEquals(123, b);
Common common = (Common)object;
fanShe.createObject(common, "printName");
}
}
2、反射了的实现
package cn.com.rwq.test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class FanShe {
/**
* 根据完整类名创建对应类的实体
* @param className 完整类名
* @return 创建的实体
*/
public Object createClass(String className)
throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class clazz = Class.forName(className);
Method m[] = clazz.getDeclaredMethods();
for(Method one : m){
System.out.println(one.toString());
}
Object object= clazz.newInstance();
return object;
}
/**
* 根据类,以及方法名,动态调用方法
* @param object 类
* @param actionName 方法名
* @return 调用的方法的返回值
*/
public static Object createObject(Object object,String actionName)
throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Method aMethod;
try {
aMethod = object.getClass().getMethod(actionName,null);
return aMethod.invoke(object,null);
} catch (NoSuchMethodException | SecurityException e1) {
e1.printStackTrace();
} catch (IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
}
3、javaBean
package cn.com.rwq.test;
/**
* javaBean
* @author Administrator
*/
public class Entity extends Common {
public Entity(){
System.out.println("Entity 构造方法");
}
public void print(){
System.out.println("执行printe 无返回值");
}
void two(){
System.out.println("执行two 方法");
}
private void siyou(){
System.out.println("执行siyou 私有方法");
}
public String strPrint(){
System.out.println("执行strPrint 有返回值");
return "abs";
}
public int intPrint(){
System.out.println("执行intPrint 有返回值");
return 123;
}
public void printName(){
System.out.println("11111111 "+super.getName());
}
public String toString(){
return "12345678";
}
public static void main(String[] args){
Entity fanshe = new Entity();
fanshe.print();
fanshe.two();
fanshe.siyou();
System.out.println(fanshe.strPrint());
}
}
4、父类
package cn.com.rwq.test;
/**
* 父类
*/
public class Common {
private String name = "123456789";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
三、重点理解
1.待实现的实体类必须有无参的构造函数
2. Class<?> demo= Class.forName(""); 根据完整类名的字符串得到指定的类
3.取得一个类的全部框架
Class<?> demo = Class.forName("cn.com.rwq.test.Entity");
System.out.println("===============本类属性========================");
// 取得本类的全部属性
Field[] field = demo.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
// 权限修饰符
int mo = field[i].getModifiers();
String priv = Modifier.toString(mo);
// 属性类型
Class<?> type = field[i].getType();
System.out.println(priv + " " + type.getName() + " "
+ field[i].getName() + ";");
}
System.out.println("=========实现的接口或者父类的属性==============");
// 取得实现的接口或者父类的属性
Field[] filed1 = demo.getFields();
for (int j = 0; j < filed1.length; j++) {
// 权限修饰符
int mo = filed1[j].getModifiers();
String priv = Modifier.toString(mo);
// 属性类型
Class<?> type = filed1[j].getType();
System.out.println(priv + " " + type.getName() + " "
+ filed1[j].getName() + ";");
}
}
}
4. //调用无参方法(Class<?> demo 实例化的类)
Method method=demo.getMethod(
"方法名"
);
method.invoke(demo.newInstance());
//调用有参数的方法
method=demo.getMethod(
"方法名
"
, String.
class
,
int
.
class
);
method.invoke(demo.newInstance(),
"Rollen"
,
20
);