Java:反射与代理

Java世界的繁荣反射这一特性有很大功劳,可以获取全面的类型信息。

/**

 * 

 */

package ref;



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;



/**

 * @author hegaofeng

 *

 */

public class Invoker {



	/**

	 * @param args

	 * @throws SecurityException 

	 * @throws NoSuchFieldException 

	 * @throws IllegalAccessException 

	 * @throws IllegalArgumentException 

	 * @throws InvocationTargetException 

	 * @throws NoSuchMethodException 

	 */

	public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {

		// TODO Auto-generated method stub

		DatabaseOps ops = (DatabaseOps)Proxy.newProxyInstance(

				DbOpsWrap.class.getClassLoader(), 

				new Class[]{DatabaseOps.class}, 

				new DbOpsWrap(new DbOpsImpl()));

		ops.deleteUser(100);

		ops.listUser();

		

		ValueFields obj = new ValueFields();

		System.out.println(obj);

		

		

		Class<?> cv = ValueFields.class;

		Field a = cv.getDeclaredField("a");

		a.setAccessible(true);

		a.set(obj, 12345);

		System.out.println(obj);

		

		

		Method m = cv.getDeclaredMethod("show", null);

		m.setAccessible(true);

		m.invoke(obj, null);

	}



}



class DbOpsImpl implements DatabaseOps {



	@Override

	public void listUser() {

		System.out.println("user listed");

	}



	@Override

	public void deleteUser(int id) {

		// TODO Auto-generated method stub

		System.out.println("user:" + id + " deleted.");

	}

}



class ValueFields {

	private int a = 1;

	protected int b=2;

	public String c="name";

	

	

	private void show() {

		System.out.println("private method show");

	}

	

	@Override

	public String toString() {

		return "ValueFields [a=" + a + ", b=" + b + ", c=" + c + "]";

	}

}



class DbOpsWrap implements InvocationHandler {

	private DbOpsImpl proxied;

	

	public DbOpsWrap(DbOpsImpl impl) {

		proxied = impl;

	}

	

	@Override

	public Object invoke(Object proxy, Method method, Object[] args)

			throws Throwable {

		

		System.out.println(method.getName());

		return method.invoke(proxied, args);

	}

}



interface DatabaseOps{

	void listUser();

	void deleteUser(int id);

}

 

Class中的

getDeclaredXXX系列函数用于获取定义在该类本层的属性方法(不包括从基类继承得到的)

getXXX系列函数用于获取所有public的属性方法,包括从父类继承得到的,但不含private,protected等非public方法。

你可能感兴趣的:(java)