反射简单讲解实例
2014-12-13 10:28
148 查看
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>}
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(); } } }