JAVA - 反射
阿新 • • 發佈:2017-07-02
class cat chm @override one urn tex user method
反射的3個特點:
1.使用字符串創建類的實例
2.使用字符串調用方法
3.使用字符串調用靜態方法
package dawang.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() { returnname; } public void setName(String name) { this.name = name; } public String show(String str) { return str+" [id=" + id + ", name=" + name + "]"; } public static void say(String hello,String world) { System.out.println(hello+",Java,"+world); } }
package dawang.model; public interface IUserDao { public void add(); }
package dawang.model; public class UserADao implements IUserDao { @Override public void add() { System.out.println("a"); } }
package dawang.model; public class UserCDao implements IUserDao { @Overridepublic void add() { System.out.println("c"); } }
package dawang.test; import dawang.model.IUserDao; import dawang.model.User; import dawang.model.UserADao; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.junit.Test; public class Test01 { //使用類實例化User對象 @Test public void test01() { User u = new User(); u.setId(1); u.setName("dawang"); System.out.println(u.show("User")); } //使用字符串實例化對象 @Test public void test02() { try { String objStr = "dawang.model.User"; Class clz = Class.forName(objStr); User u = (User)clz.newInstance(); u.setId(1); u.setName("dawang"); System.out.println(u.show("ref")); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } @Test public void test03() { try { String objStr = "dawang.model.User"; Class clz = Class.forName(objStr); User u = (User)clz.newInstance(); u.setId(1); u.setName("dawang"); String mm = "show"; /** * 第一個參數是函數的名稱,第二個參數是...(表示有無限個參數)表示函數的參數 */ Method method = clz.getMethod(mm, String.class); /** * 第一個參數是調用函數的對象,第二個參數是函數執行時的參數 * u.show("dawang"); */ String str = (String)method.invoke(u, "dawang"); System.out.println(str); /** * 同樣可以調用static的方法 */ Method m2 = clz.getMethod("say", String.class,String.class); /** * 調用Static的方法是使用class來調用 */ m2.invoke(clz, "ok","world"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } @Test public void testDao01() { IUserDao u1 = new UserADao(); u1.add(); } @Test public void testDao02() { try {
//只需要修改配置文件就可以改變類的調用 String dao = "dawang.model.UserCDao"; IUserDao ud = (IUserDao)Class.forName(dao).newInstance(); ud.add(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
JAVA - 反射