介是啥米东东

Java反射机制实例

Java admin 2286℃ 0评论

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反射机制实例

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址