什么是Java反射机制以及动态代理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013233360/article/details/78940871

反射机制定义

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。

反射机制获取类的三种方式

1.类名.class

		//通过类名.class获取类信息
		Class c = Car.class; 
		//获取类方法
		Method[] methods = c.getMethods();
		//打印方法名称
		for(Method method : methods){
			System.out.println(method.getName());
		}

2.通过对象的getClass()方法获取
		//创建对象实例
		Car car = new Car();
		//通过对象的getClass()方法获取类信息
		Class c = car.getClass();
		//获取类的构造函数
		Constructor[] con = c.getConstructors();
		//打印构造函数的名称
		for(Constructor cc:con){
			System.out.println(cc.getName());
		}
 3.通过全类名获取Class.forName()
		//通过全类名Class.forName获取类信息
		Class c = Class.forName("classDemo.Car");
		//通过class中的netInstance()方法实例化Car对象
		Car o =  (Car)c.newInstance();
		//调用car对象中的test()方法
		o.test();
   

使用场景

跨网络的远程平台创建和运行对象的能力,即远程方法调用(RMI)
逆向工程
基于注解实现的框架

动态代理

代理:基本的设计模式之一,它是为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象。
代理通常充当着中间人的角色。

public interface objectDemo {
	public void doSomething();
}

/**
 * 被代理实现类
 * @author liumengxi
 *
 * 2017-12-31
 */
public class objectDemoImpl implements objectDemo {

	@Override
	public void doSomething() {
		
		System.out.println("objectDemoImpl");

	}

}
/**
 * 代理实现类
 * @author liumengxi
 *
 * 2017-12-31
 */
public class proxyObjectDemoImpl implements objectDemo {

	
	private objectDemoImpl dl;
	
	public proxyObjectDemoImpl(objectDemoImpl dl){
		this.dl = dl;
	}
	@Override
	public void doSomething() {
		System.out.println("proxyObjectDemoImpl dosomething....");
		dl.doSomething();

	}

}
/**
 * 测试
 * @author liumengxi
 *
 * 2017-12-31
 */
public class proxyObjectMain {

	public static void consumer(objectDemo od){
		od.doSomething();
	}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		//执行被代理类方法
		consumer(new objectDemoImpl());
		//执行代理类方法
		consumer(new proxyObjectDemoImpl(new objectDemoImpl()));
		
	}

}

动态代理:动态的创建代理并动态地处理对所代理方法的调用。在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,它的工作是揭示调用的类型并确定相应的对策。

/**
 * 动态代理
 * @author liumengxi
 *
 * 2017-12-31
 */
public class DynamicProxyHandler implements InvocationHandler {

	private Object proxid;
	
	public DynamicProxyHandler(Object proxid){
		
		this.proxid = proxid;
	}
	
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		
		
		//mthod.invoke将请求转发给被代理对象执行
		return method.invoke(proxid, args);
	}

}
/**
 * 测试
 * @author liumengxi
 *
 * 2017-12-31
 */
public class proxyObjectMain {

	public static void consumer(objectDemo od){
		od.doSomething();

	}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		

		
		//执行被代理类方法
		objectDemoImpl od = new objectDemoImpl();
		consumer(od);
		
		/**
		 * 创建动态代理
		 * Proxy.newProxyInstance()可以创建动态代理
		 * 以下为newProxyInstance参数
		 * objectDemo.class 类加载器
		 * new Class[]{objectDemo.class} 该代理实现的接口
		 * DynamicProxyHandler InvocationHandler接口的一个实现
		 */
		objectDemo o = (objectDemo) Proxy.newProxyInstance(objectDemo.class.getClassLoader(), 
				new Class[]{objectDemo.class}, new DynamicProxyHandler(od));
		
		
		consumer(od);
		
		
	}

}



猜你喜欢

转载自blog.csdn.net/u013233360/article/details/78940871