zoukankan      html  css  js  c++  java
  • java反射和动态代理

    获取Class的方式:Class c1 = String.class;(很少用)Class c2 = person.getClass();Class c3 = Class.forName(String classPath);(参数是类的完全限定名,提现反射的动态性)
    Class实例对应着加载到内存中的一个运行时类。
    创建Class对应运行时类的对象的通用方法,Person类必须要有空参构造函数,且修饰符的权限要够,一般是public的。
    创建Class方式:
    1、Class.forName("com.jay.ct.Person")
    2、new Person().getClass()
    3、Person.class
    4、Person.class.getClassLoader().loadClass("com.jay.ct.Person")

    Class class1 = Class.forName("com.jay.ct.Person");
    Object obj = class1.getDeclaredConstructor().newInstance();//java9之后推荐写法
    Method show = class1.getMethod("show", String.class);
    show.setAccessible(true); Object res = show.invoke(obj, "123456");//res就是show方法return的值

     静态代理和动态代理

    package com.jay.ct;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class DynamicAgentTest {
    	public static void main(String[] args) throws Exception {
    		// 静态代理
    //		LiNingFac lnFac = new LiNingFac();
    //		ProxyClothFac pfac = new ProxyClothFac(lnFac);
    //		pfac.produceCloth();
    
    		// 动态代理
    		Constructor<?> cons = Class.forName("com.jay.ct.LiNingFac").getDeclaredConstructor();
    		cons.setAccessible(true);
    		Object lnFac = cons.newInstance();
    		Object obj = ProxyFac.getProxyInstance(lnFac);
    		ClothFac fac = (ClothFac) obj;
    		fac.produceCloth();
    	}
    }
    
    interface ClothFac {
    	void produceCloth();
    }
    
    //动态代理类
    class ProxyFac {
    	// 参数 obj 是被代理类对象,返回的是代理类对象
    	public static Object getProxyInstance(Object obj) {
    		// 注册被代理类的invoke方法
    		MyInvocationHandler ih = new MyInvocationHandler();
    		ih.bind(obj);
    		Object p = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), ih);
    		return p;
    	}
    }
    
    class MyInvocationHandler implements InvocationHandler {
    
    	private Object obj;
    
    	public void bind(Object obj) {
    		this.obj = obj;
    	}
    
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		Object res = method.invoke(obj, args);
    		return res;
    	}
    
    }
    
    //静态代理类
    class ProxyClothFac implements ClothFac {
    	public ProxyClothFac(ClothFac fac) {
    		super();
    		this.fac = fac;
    	}
    
    	private ClothFac fac;
    
    	public ProxyClothFac() {
    	}
    
    	@Override
    	public void produceCloth() {
    		System.out.println("代理工厂开始");
    		this.fac.produceCloth();
    		System.out.println("代理工厂结束");
    	}
    }
    
    class LiNingFac implements ClothFac {
    
    	@Override
    	public void produceCloth() {
    		System.out.println("LiNing工厂生产");
    	}
    }
    
  • 相关阅读:
    jQuery火箭图标返回顶部代码
    类库引用EF
    Html.DropDownList
    MVC validation
    MVC @functions
    MVC 扩展方法特点
    Class 实现IDisposing方法
    MVC两个必懂核心
    Asp.net 服务器Application,Session,Cookie,ViewState和Cache区别
    sqlserver log
  • 原文地址:https://www.cnblogs.com/xsj1989/p/14975792.html
Copyright © 2011-2022 走看看