java 反射 demo

原创 2012年03月26日 17:43:38

反射 代码 :

package wfg.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.junit.Test;

/**
 * @Member接口 该接口可以获取有关类成员(域或者方法)后者构造函数的信息。
 *@AccessibleObject类 
 *                    该类是域(field)对象、方法(method)对象、构造函数(constructor)对象的基础类。它提供了将反射的对象标记为在使用时取消默认Java
 *                    语言访问控制检查的能力。
 *@Array类 该类提供动态地生成和访问JAVA数组的方法。
 *@Constructor类 提供一个类的构造函数的信息以及访问类的构造函数的接口。
 *@Field类 提供一个类的域的信息以及访问类的域的接口。
 *@Method类 提供一个类的方法的信息以及访问类的方法的接口。
 *@Modifier类 提供了 static 方法和常量,对类和成员访问修饰符进行解码。
 *@Proxy类 提供动态地生成代理类和类实例的静态方法。
 * 
 * @author wangkf
 */
public class ReflectTest {
	/**
	 * 可见getFields和getDeclaredFields区别 getFields返回的是申明为public的属性,包括父类中定义,
	 * getDeclaredFields返回的是指定类定义的所有定义的属性,不包括父类的。
	 */
	@Test
	public void getField() {
		Class<?> dataClass = ExtendData.class;
		// 使用getFields获取属性
		Field[] fields = dataClass.getFields();
		for (Field f : fields) {
			System.out.println("getFields:  " + f);
		}
		System.out.println();
		// 使用getDeclaredFields获取属性
		fields = dataClass.getDeclaredFields();
		for (Field f : fields) {
			System.out.println("getDeclaredFields:  " + f);
		}
	}

	/**
	 * 获得方法
	 */
	@Test
	public void getMethods() {
		Class<?> dataClass = ExtendData.class;
		Method[] methods = dataClass.getMethods();
		for (Method m : methods) {
			System.out.println("getMethods:  " + m);
		}
		System.out.println();
		// 使用getDeclaredMethods获取函数
		methods = dataClass.getDeclaredMethods();
		for (Method m : methods) {
			System.out.println("getDeclaredMethods:  " + m);
		}
	}

	/**
	 * 获取类的Constructor
	 */
	@Test
	public void getConstructors() {
		Class<?> dataClass = ExtendData.class;
		Constructor<?>[] constructors = dataClass.getConstructors();
		for (Constructor<?> m : constructors) {
			System.out.println("getConstructors:" + " " + m);
		}
		System.out.println();
		// 使用getDeclaredConstructors获取构造器
		constructors = dataClass.getDeclaredConstructors();
		for (Constructor<?> m : constructors) {
			System.out.println("getDeclaredConstructors:  " + m);
		}

	}

	/**
	 * 创建类实例
	 * 
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws NoSuchMethodException
	 * @throws SecurityException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 */
	@Test
	public void getNewInstance() throws InstantiationException,
			IllegalAccessException, SecurityException, NoSuchMethodException,
			IllegalArgumentException, InvocationTargetException {
		Object inst = null;
		Class<?> dataClass = ExtendData.class;
		Constructor<?> constructor;
		// 1、调用类的Class对象的newInstance方法,该方法会调用对象的默认构造器,如果没有默认构造器,会调用失败.
		inst = dataClass.newInstance();
		System.out.println("1: " + inst);
		// 2、调用默认Constructor对象的newInstance方法
		constructor = dataClass.getConstructor();
		inst = constructor.newInstance();
		System.out.println("2: " + inst);
		// 3、调用带参数Constructor对象的newInstance方法
		constructor = dataClass.getDeclaredConstructor(int.class, String.class);
		inst = constructor.newInstance(1, "123");
		System.out.println("3: " + inst);
	}

	/**
	 * 调用类的函数
	 * 
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws NoSuchMethodException
	 * @throws SecurityException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 */
	@Test
	public void fieldInvoke() throws InstantiationException,
			IllegalAccessException, SecurityException, NoSuchMethodException,
			IllegalArgumentException, InvocationTargetException {
		Class<?> dataClass = ExtendData.class;
		Object inst = dataClass.newInstance();
		Method logMethod = dataClass.getDeclaredMethod("pubExtendDataMethod",
				String.class);
		logMethod.invoke(inst, "Hello,world!");
	}

	/**
	 * 设置/获取类的属性值
	 * 
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws NoSuchFieldException
	 * @throws SecurityException
	 */
	@Test
	public void setFieldValue() throws InstantiationException,
			IllegalAccessException, SecurityException, NoSuchFieldException {
		Class<?> dataClass = ExtendData.class;
		Object inst = dataClass.newInstance();
		Field intField = dataClass.getField("pubExtendFieldId");
		intField.setInt(inst, 100);
		int value = intField.getInt(inst);
		System.out.println(value);
	}
	/**
	 * 动态创建代理类
	 */
//	代理模式:代理模式的作用=为其他对象提供一种代理以控制对这个对象的访问。
//	代理模式的角色:
//	抽象角色:声明真实对象和代理对象的共同接口
//	代理角色:代理角色内部包含有真实对象的引用,从而可以操作真实对象。
//	真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
//	动态代理:
//	java.lang.reflect.Proxy	
//	Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类
//	InvocationHandler	
//	是代理实例的调用处理程序 实现的接口,每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。
//	 
//	动态Proxy是这样的一种类:
//	它是在运行生成的类,在生成时你必须提供一组Interface给它,然后该class就宣称它实现了这些interface。你可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
//	在使用动态代理类时,我们必须实现InvocationHandler接口
	@Test
	public void useProxy(){
		Data data = new Data();
		InvocationHandler handler = new DynamicData(data);
		Class<?> classType = handler.getClass();
		IData iData = (IData)Proxy.newProxyInstance(classType.getClassLoader(),
		data.getClass().getInterfaces(), handler);
		System.out.println(iData.getClass());  
	}
}

其它类包:
package wfg.reflect;

public interface IData {
   public void getData();
}
package wfg.reflect;


public class Data implements IData {
	public int pubFieldId;
	public String pubFieldName;
	private int prvFieldId;

	public Data() {
		System.out.println("data默认 构造器 ");
	}

	Data(int arg1, String arg2) {
		pubFieldId = arg1;
		pubFieldName = arg2;
		System.out.println("data带参数构造器 ");
	}

	private void prvDataMethod() {
		System.out.println("data方法 :带参数构造器 ");
	}

	@Override
	public void getData() {
		System.out.println("getData");
	}
}

package wfg.reflect;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

class ExtendData extends Data {
	public int pubExtendFieldId;
	public String pubExtendFieldName;
	private int prvExtendFieldId;

	public ExtendData() {
		System.out.println("ExtendData默认 构造器 ");
	}

	public String pubExtendDataMethod(String str) {
		System.out.println("pubExtendDataMethod:  str=" + str);
		return str;
	}

	private void prvExtendDataMethod() {
		System.out.println("ExtendData私有方法:prvExtendDataMethod ");
	}

	ExtendData(int arg1, String arg2) {
		pubExtendFieldId = arg1;
		pubExtendFieldName = arg2;
		System.out
				.println("ExtendData带参构造函数:prvExtendDataMethod 参数:pubExtendFieldId = "
						+ arg1 + "  pubExtendFieldName = " + arg2);
	}

	public int getPrvExtendFieldId() {
		return prvExtendFieldId;
	}

	public void setPrvExtendFieldId(int prvExtendFieldId) {
		this.prvExtendFieldId = prvExtendFieldId;
	}
}

package wfg.reflect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicData implements InvocationHandler {
	private Object obj;
	public DynamicData(Data data) {
		this.obj=data;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("Method:"+ method + ",Args:" + args);
		method.invoke(obj, args);
		return null;
	}
}


JAVA反射demo例子

public class ReflectPoint { private int x; public int y; public String str1 = "ball"; p...
  • hbiao68
  • hbiao68
  • 2013年12月04日 09:44
  • 292

Java笔记-反射机制(三)-小demo

经过前面几次反射机制的学习,这次用反射的知识写一个类似于Struts框架处理机制的小demo。Servlet 和 Sturts在引入反射知识前,先简单介绍下Sturts框架和Servlet。 在没有...

Java编程之反射-demo

本节写了个Demo测试反射机制的主要方法,代码如下

Java反射Demo

代码结构: 1、用户Bean类: package com.wc.plugin; import java.io.Serializable; /** * @function 用户Bean类 ...
  • wrs1226
  • wrs1226
  • 2015年10月21日 15:24
  • 155

java反射学习-以demo加理伦

一、首先介绍一下Class类是什么?1.class类的实例表示java应用运行时的类(class ans enum)或接口(interface and annotation)(每个java类运行时都在...

DEMO:java反射机制获取该类的所有属性类型、值

导入必须的两个包:import Java.lang.reflect.Field; import java.lang.reflect.Method; Demo: public static void...

java反射生成DAO【demo】

java反射生成DAO【demo】java反射生成DAOdemo java注解和反射制作dao基类的练习 java 反射写的 通用DAO 类java注解和反射制作dao基类的练习转载地址: http...
  • Weigal
  • Weigal
  • 2016年05月05日 21:36
  • 460

java反射机制的Demo

/*  *功能:   通过带参数的构造函数创建一个Student类的对象student1   然后通过java的反射机制在程序的运行过程中,再创建一个对象student2(通过反射机制创建) ...

java/android 反射demo,通俗易懂,你值得拥有!!!

package com.example;public class Student {// 变量和setAge、getAge方法都是私有的 private String id, name, sex; p...

Java 反射机制学习Demo

Java 反射机制学习Demo 1. 什么是Java反射机制?     反射机制是Java语言的一个关键性质,它允许我们在程序运行时,获取类的全部(包括private修饰的)成员变量和成员方法,并能动...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 反射 demo
举报原因:
原因补充:

(最多只允许输入30个字)