1.概念
反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力
Java中的反射是一种强大的工具,它能够创建灵活的代码,这些代码可以运行时装配,无须在组件之间进行链接
反射允许在编写与执行时,使程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码
如果使用不当,反射的成本会很高
2.例子
package Test; import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier; interface TestInterface{
public static String username = "zhengbin";
public static String password = "19950906";
public String add(); } class Demo implements TestInterface{
private String username;
private String password; public Demo() {
super();
} // public Demo(String username, String password) {
// super();
// this.username = username;
// this.password = password;
// } public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String toString() {
return "Demo [username=" + username + ", password=" + password + "]";
}
public String add(){
return "add()";
}
} public class Test1 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Demo d = null;
/* Class 在API中的解释:
*
* Class 类的实例表示正在运行的 Java 应用程序中的类和接口
* 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象
* 基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象
* Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的
*
*/
Class<?> c = Class.forName("Test.Demo");
System.out.println(c.getName()); d = (Demo)c.newInstance();
d.setUsername("zhengbin");
d.setPassword("19950906");
System.out.println(d); // 获得反射类的父类
System.out.println(d.getClass().getSuperclass().getName()); // 获得类中的全部构造函数
Constructor<?> cons[] = c.getConstructors();
for(int i = 0;i < cons.length;i++){
System.out.println(cons[i]);
} System.out.println("---------本类的所有属性----------");
// 获得本类的所有属性
Field[] field = c.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
// 权限修饰符
int mo = field[i].getModifiers();
// 获得属性名
String priv = Modifier.toString(mo);
// 属性类型
Class<?> type = field[i].getType();
System.out.println(priv + " " + type.getName() + " "
+ field[i].getName() + ";");
} System.out.println("---------实现的接口或者父类的属性----------");
// 取得实现的接口或者父类的属性
Field[] filed1 = c.getFields();
for (int j = 0; j < filed1.length; j++) {
// 权限修饰符
int mo = filed1[j].getModifiers();
String priv = Modifier.toString(mo);
// 属性类型
Class<?> type = filed1[j].getType();
System.out.println(priv + " " + type.getName() + " "
+ filed1[j].getName() + ";");
}
} }
运行结果:
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() 方法
package Test; import java.lang.reflect.Method; public class Test2 { @org.junit.Test
public void test1(){
try {
Class c = Class.forName("Test.Say");
Object o = c.newInstance(); Method m = c.getDeclaredMethod("sayHello");
m.invoke(o); Method m1 = c.getDeclaredMethod("sayName", String.class);
m1.invoke(o, "zhengbin");
} catch (Exception e) {
e.printStackTrace();
}
} } class Say{
public void sayHello(){
System.out.println("Hello World");
}
public void sayName(String name){
System.out.println("Hello "+name);
}
}
运行结果:
Hello World
Hello zhengbin
详情:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html