一天一个Java基础——反射
1.概念
反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力
Java中的反射是一种强大的工具,它能够创建灵活的代码,这些代码可以运行时装配,无须在组件之间进行链接
反射允许在编写与执行时,使程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码
如果使用不当,反射的成本会很高
2.例子
1 package Test; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.Modifier; 6 7 interface TestInterface{ 8 public static String username = "zhengbin"; 9 public static String password = "19950906"; 10 public String add(); 11 12 } 13 14 class Demo implements TestInterface{ 15 private String username; 16 private String password; 17 18 public Demo() { 19 super(); 20 } 21 22 // public Demo(String username, String password) { 23 // super(); 24 // this.username = username; 25 // this.password = password; 26 // } 27 28 public String getUsername() { 29 return username; 30 } 31 public void setUsername(String username) { 32 this.username = username; 33 } 34 public String getPassword() { 35 return password; 36 } 37 public void setPassword(String password) { 38 this.password = password; 39 } 40 public String toString() { 41 return "Demo [username=" + username + ", password=" + password + "]"; 42 } 43 public String add(){ 44 return "add()"; 45 } 46 } 47 48 public class Test1 { 49 50 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 51 Demo d = null; 52 /* Class 在API中的解释: 53 * 54 * Class 类的实例表示正在运行的 Java 应用程序中的类和接口 55 * 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象 56 * 基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象 57 * Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的 58 * 59 */ 60 Class<?> c = Class.forName("Test.Demo"); 61 System.out.println(c.getName()); 62 63 d = (Demo)c.newInstance(); 64 d.setUsername("zhengbin"); 65 d.setPassword("19950906"); 66 System.out.println(d); 67 68 // 获得反射类的父类 69 System.out.println(d.getClass().getSuperclass().getName()); 70 71 // 获得类中的全部构造函数 72 Constructor<?> cons[] = c.getConstructors(); 73 for(int i = 0;i < cons.length;i++){ 74 System.out.println(cons[i]); 75 } 76 77 System.out.println("---------本类的所有属性----------"); 78 // 获得本类的所有属性 79 Field[] field = c.getDeclaredFields(); 80 for (int i = 0; i < field.length; i++) { 81 // 权限修饰符 82 int mo = field[i].getModifiers(); 83 // 获得属性名 84 String priv = Modifier.toString(mo); 85 // 属性类型 86 Class<?> type = field[i].getType(); 87 System.out.println(priv + " " + type.getName() + " " 88 + field[i].getName() + ";"); 89 } 90 91 System.out.println("---------实现的接口或者父类的属性----------"); 92 // 取得实现的接口或者父类的属性 93 Field[] filed1 = c.getFields(); 94 for (int j = 0; j < filed1.length; j++) { 95 // 权限修饰符 96 int mo = filed1[j].getModifiers(); 97 String priv = Modifier.toString(mo); 98 // 属性类型 99 Class<?> type = filed1[j].getType(); 100 System.out.println(priv + " " + type.getName() + " " 101 + filed1[j].getName() + ";"); 102 } 103 } 104 105 }
运行结果:
Test.Demo Demo [username=zhengbin, password=yqxx950906] java.lang.Object public Test.Demo() ---------本类的所有属性---------- private java.lang.String username; private java.lang.String password; ---------实现的接口或者父类的属性---------- public static final java.lang.String username; public static final java.lang.String password;
例二:
现在要求:
(1) 你不能使用 HelloWorld hw = new HelloWorld(),但是要构建一个HelloWorld的实例来
(2) 调用 sayHello() 方法,但是不能直接用 HelloWorld实例的 hw.sayHello() 方法
1 package Test; 2 3 import java.lang.reflect.Method; 4 5 public class Test2 { 6 7 @org.junit.Test 8 public void test1(){ 9 try { 10 Class c = Class.forName("Test.Say"); 11 Object o = c.newInstance(); 12 13 Method m = c.getDeclaredMethod("sayHello"); 14 m.invoke(o); 15 16 Method m1 = c.getDeclaredMethod("sayName", String.class); 17 m1.invoke(o, "zhengbin"); 18 } catch (Exception e) { 19 e.printStackTrace(); 20 } 21 } 22 23 } 24 25 class Say{ 26 public void sayHello(){ 27 System.out.println("Hello World"); 28 } 29 public void sayName(String name){ 30 System.out.println("Hello "+name); 31 } 32 }
运行结果:
Hello World
Hello zhengbin
详情:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
梦想要一步步来!