现在的位置: 首页 > 综合 > 正文

Java反射实例

2018年01月29日 ⁄ 综合 ⁄ 共 2203字 ⁄ 字号 评论关闭

JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

通过一个例子来进行基本的操作:

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);
	}
}

http://115.28.189.59/?p=106

抱歉!评论已关闭.