您的位置:首页 > 其它

反射简单讲解实例

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>}
<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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: