JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
通过一个例子来进行基本的操作:
被测试类
package com.znn.reflect;
public class Persion {
public static String TAG = “Persion TAG”;
private String name;
privateintage;
public Persion() {
}
public Persion(String name, int age) {
super();
this.name = name;
this.age = age;
}
public void sayHi() {
System.out.println(“hello “+this.name);
}
private int getBornYear(String para) {
System.out.println(para+“:getBornYear…”);
return 2014-this.age;
}
public static void printTag() {
System.out.println(“printTag…”);
System.out.println(“TAG:”+TAG);
}
@Override
public String toString() {
return“Persion [name=" + name + ", age=" + age + "] + TAG:”+TAG;
}
public String getName() {
returnname;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
returnage;
}
public void setAge(int age) {
this.age = age;
}
}
测试类
package com.znn.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchFieldException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
Class<?> clazz = Class.forName("com.znn.reflect.Persion");
//获取类的包名和类名
String fullName = "包名:"+clazz.getPackage().getName()+" 类名"+clazz.getName();
System.out.println(fullName);
//创建类对象 必须提供无参构造方法 也可以使用getConstructions()获取所有构造函数
Persion persion = (Persion) clazz.newInstance();
persion.setName("zhangningning");
persion.setAge(20);
System.out.println("创建类实例对象:"+persion);
//获取成员变量
Field nameField = clazz.getDeclaredField("name");//获取所有的成员字段 getField(String name)是获取公共的
nameField.setAccessible(true);
nameField.set(persion, "znn");
System.out.println("设置私有的成员变量:"+persion);
//获取并设置静态变量
Field tagField = clazz.getField("TAG");
tagField.set(null, tagField.get(null)+" Modify...");
System.out.println("设置私有的静态变量:"+persion);
//获取父类 getGenericSuperclass() 表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。
Class<?> superClass = clazz.getSuperclass();
System.out.println("父类:"+superClass);
//获取所有的成员
Field field[] = clazz.getDeclaredFields();
System.out.println("\n所有成员:");
for (int i = 0; i < field.length; i++) {
System.out.println(field[i]);
}
//获取所有方法
System.out.println("\n所有方法:");
Method method[] = clazz.getDeclaredMethods();
for (int i = 0; i < method.length; i++) {
System.out.println(method[i]);
}
//执行静态方法
System.out.println("\n执行静态方法:");
Method m1 = clazz.getMethod("printTag", null);
m1.invoke(null, null);
//执行私有实例方法
System.out.println("\n执行私有实例方法:");
Method m3 = clazz.getDeclaredMethod("getBornYear", String.class);
m3.setAccessible(true);
Integer year = (Integer) m3.invoke(persion, "PARA");
System.out.println("BIRTH="+year);
//执行公共实例方法
System.out.println("执行公共实例方法");
Method m4 = clazz.getMethod("sayHi", null);
m4.invoke(persion, null);
}
}
转载请注明:Z/RANDY » Java反射机制实例