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

  • A+
所属分类:Java

反射机制定义

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(o);
		
		
	}
 
}
  • 我的微信
  • 加好友一起交流!
  • weinxin
  • 微信公众号
  • 关注公众号获取分享资源!
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: