java aop 反射 例子

首先需要一个被测试的类,,这个类需要有属性和方法,并且这些属性和方法需要有不同权限修饰符



package com.memorycat.aoptest.reflect;

public class Reflect1 {

	private int id;
	protected String myName;

	public Reflect1() {
		super();
		System.out.println("正在执行方法:public Reflect1() <- 默认构造方法");
	}

	private void foo1() {
		System.out.println("正在执行方法:private void foo1()");
	}

	public void foo2() {
		System.out.println("正在执行方法:public void foo2()");
	}

	public void printAttr() {
		System.out.println("正在执行方法: printAttr() -> [id=" + id + ", myName="
				+ myName + "]");
	}

	int add(int num1, int num2) {
		return num1 + num2;
	}

	int add(int num1, int num2, int num3) {
		return num1 + num2 + num3;
	}
}



然后,随便写一个测试类,从反射得到被测试类的各种属性和方法,并尝试去修改和调用



package com.memorycat.aoptest.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTest {

	public static void main(String[] args) throws Throwable {

		Class<Reflect1> clazz = Reflect1.class;

		Reflect1 reflect1 = (Reflect1) clazz.newInstance();// 调用默认构造方法

		System.out.println("***********现在获取类属性***********");
		Field[] fields = clazz.getDeclaredFields();
		for (Field field : fields) {

			field.setAccessible(true);// 设置为可以访问<-private

			// 为id设置为9<-private
			if ((field.getType().getCanonicalName().equals("int") || field
					.getType().getCanonicalName().equals("java.lang.Integer"))
					&& field.getName().equals("id")) {
				field.setInt(reflect1, 9);
			}

			System.out.println("-----------------------");
			System.out.println("属性名" + field.getName());
			System.out.println("属性类型" + field.getType());
			System.out.println("属性值" + field.get(reflect1));
			System.out.println(field.getType() + " " + field.getName() + " = "
					+ field.get(reflect1) + ";");

		}

		System.out.println("***********现在获取类方法***********");
		Method[] declaredMethods = clazz.getDeclaredMethods();
		for (Method method : declaredMethods) {

			method.setAccessible(true);// 设置可以访问权限 <-private
			Class[] parameterTypes = method.getParameterTypes();

			System.out.println(">>执行方法:" + method);

			if (parameterTypes.length == 0) {
				method.invoke(reflect1, null);
			} else {

				// 判断int add(int num1, int num2)
				if (method.getName().equals("add")
						&& parameterTypes.length == 2) {

					int result = (int) method.invoke(reflect1, new Object[] {
							2, 7 });
					System.out.println("2+7=" + result);
				} else {
					if (method.getName().equals("add")
							&& parameterTypes.length == 3) {
						System.out.println("这还有3个参数的add()");
					}
				}
			}
		}
	}
}





最后输出结果


正在执行方法:public Reflect1() <- 默认构造方法
***********现在获取类属性***********
-----------------------
属性名id
属性类型int
属性值9
int id = 9;
-----------------------
属性名myName
属性类型class java.lang.String
属性值null
class java.lang.String myName = null;
***********现在获取类方法***********
>>执行方法:int com.memorycat.aoptest.reflect.Reflect1.add(int,int)
2+7=9
>>执行方法:int com.memorycat.aoptest.reflect.Reflect1.add(int,int,int)
这还有3个参数的add()
>>执行方法:private void com.memorycat.aoptest.reflect.Reflect1.foo1()
正在执行方法:private void foo1()
>>执行方法:public void com.memorycat.aoptest.reflect.Reflect1.foo2()
正在执行方法:public void foo2()
>>执行方法:public void com.memorycat.aoptest.reflect.Reflect1.printAttr()
正在执行方法: printAttr() -> [id=9, myName=null]



评论列表