【java】反射可执行的实例

一、实例目标

根据传入的完整类名字符串类名,实现创建对应类的实例

根据传入的类实例,以及传入的方法名字符串,实现动态调用指定的方法,返回方法的返回值

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 );

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值