反射简单讲解实例

java中的反射非常好用,加入有接口A,其实现类为AImpl,那么一般情况下我们创建A的实例是使用多太:A a = new AImpl();,但是这种方式如果我们换其他的实现类的话,就得手动修改如A a = new AImpl2(),这样违背了开放封闭原则。然而,反射通过将new类的形式转换成string的形式,就可以通过配置文件来完成,从而实现很方便。下面举简单的例子来实现多台


1、User类

package com.lxp.model;

public class User {
	private int id;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String show(String str) {
		return str+" [id=" + id + ", name=" + name + "]";
	}
	
	public static void sayHello(String hello,String world) {
		System.out.println(hello+",hhhhhhh" +world);
	}
}

2、测试多太类:(1)首先可以通过test02来通过一个类的字符串路径来获得User类的实例,通过(User)Class.forName(Str).newInstance();即可。(2)test03方法可以通过字符串的形式执行类里面的方法,而不用直接通过类的实例去找,通过反射是可以通过字符串找到方法的,首先要获得一个Method对象,invoke(obj,para)第一个参数是调用函数的对象(也就是谁要调用方法),第二个参数是函数执行时的参数,对于static方法,其调用方式是使用Class来调,而不是使用某一个具体的类的对象。

package com.lxp.test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Test;

import com.lxp.dao.IUserDao;
import com.lxp.dao.impl.UserDaoAImpl;
import com.lxp.model.User;

public class Test01 {
	@Test
<span style="white-space:pre">	</span>public void test02() {
<span style="white-space:pre">		</span>String str = "com.lxp.model.User";
<span style="white-space:pre">		</span>try {
<span style="white-space:pre">			</span>Class clz = Class.forName(str);
<span style="white-space:pre">			</span>User u = (User)clz.newInstance();
<span style="white-space:pre">			</span>u.setId(1);
<span style="white-space:pre">			</span>u.setName("abc");
<span style="white-space:pre">			</span>System.out.println(u.show("ref"));
<span style="white-space:pre">		</span>} catch (ClassNotFoundException e) {
<span style="white-space:pre">			</span>// TODO Auto-generated catch block
<span style="white-space:pre">			</span>e.printStackTrace();
<span style="white-space:pre">		</span>} catch (InstantiationException e) {
<span style="white-space:pre">			</span>// TODO Auto-generated catch block
<span style="white-space:pre">			</span>e.printStackTrace();
<span style="white-space:pre">		</span>} catch (IllegalAccessException e) {
<span style="white-space:pre">			</span>// TODO Auto-generated catch block
<span style="white-space:pre">			</span>e.printStackTrace();
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>@Test
	public void test03() {
		String str = "com.lxp.model.User";
		try {
			Class clz = Class.forName(str);
			User u = (User)clz.newInstance();
			u.setId(1);
			u.setName("abc");
			String mm = "show";//函数名称
			/*
			 * 第一个参数指函数名称,第二个指函数的参数
			 */
			Method method = clz.getMethod(mm, String.class);
			/*
			 * 第一个参数是调用函数的对象,第二个参数是函数执行时的参数
			 *如使用u.show("abc"),就是使用u来调用方法show,其参数是abc
			 */
			String str2 = (String)method.invoke(u, "abc");
			System.out.println("str2:"+str2);
			System.out.println(u.show("ref"));
			/*
			 * 同样可以调用静态方法
			 */
			Method m2 = clz.getMethod("sayHello", String.class,String.class);
			m2.invoke(clz, "夏末","你好");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Test
	public void testDaoAImpl() {
		IUserDao u1 = new UserDaoAImpl();
		u1.add();
	}
	@Test
	public void testDaoBImpl() {
		String dao = "com.lxp.dao.impl.UserDaoAImpl";
		try {
			IUserDao ud = (IUserDao)Class.forName(dao).newInstance();
			ud.add();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值