首页 > 代码库 > JAVA - 反射
JAVA - 反射
反射的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() { return name; } 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 { @Override public 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 - 反射
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。