簡単な説明の例を反射
5282 ワード
JAvaでの反射は非常に使いやすく、インタフェースAが入っていて、実際にはクラスがAImplであるが、一般的にAを作成する例は多すぎる:A a=new AImpl();しかし,この方式を他の実装クラスに置き換えると,A a=new AImpl 2()のように手動で修正しなければならず,開放閉鎖の原則に反する.しかしながら、反射はnewクラスの形式をstringの形式に変換することで、プロファイルで行うことができ、容易に実現できる.以下に簡単な例を挙げて複数台を実現する
1、Userクラス
2、テストの多すぎる類:(1)まずtest 02を通じて1つの類の文字列の経路を通じてUser類の実例を得ることができて、(User)Class.forName(Str).newInstance()を通じて;できます.(2)test 03メソッドはクラス内のメソッドを文字列の形式で実行することができ,直接クラスのインスタンスで探す必要はなく,反射によって文字列でメソッドを見つけることができ,まずMethodオブジェクトを取得し,invoke(obj,para)の最初のパラメータは関数を呼び出すオブジェクト(つまり誰がメソッドを呼び出すか),2番目のパラメータは関数実行時のパラメータである.staticメソッドの場合、特定のクラスのオブジェクトではなくClassを使用して呼び出されます.
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)まずtest 02を通じて1つの類の文字列の経路を通じてUser類の実例を得ることができて、(User)Class.forName(Str).newInstance()を通じて;できます.(2)test 03メソッドはクラス内のメソッドを文字列の形式で実行することができ,直接クラスのインスタンスで探す必要はなく,反射によって文字列でメソッドを見つけることができ,まずMethodオブジェクトを取得し,invoke(obj,para)の最初のパラメータは関数を呼び出すオブジェクト(つまり誰がメソッドを呼び出すか),2番目のパラメータは関数実行時のパラメータである.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();
}
}
}