反射简单讲解实例

来源:互联网 发布:学高等数学的软件 编辑:程序博客网 时间:2024/06/06 13:03

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>@Testpublic 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 blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Testpublic void testDaoAImpl() {IUserDao u1 = new UserDaoAImpl();u1.add();}@Testpublic 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 blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}


0 0
原创粉丝点击