zoukankan      html  css  js  c++  java
  • java动态代理类

      很有意思的一个东西,在java.lang.reflect包下

      示例代码

    package com.guangshan.test.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class ProxyClass implements InvocationHandler {
    
        private Object target;
        
        public ProxyClass() {
            // TODO Auto-generated constructor stub
        }
        
        public ProxyClass(Object object) {
            this.target = object;
        }
        
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            Object object = method.invoke(this.target, args); //大致和js中的apply(call)类似,第一个把this传进去,第二个把参数传进去,返回方法调用的返回值
            System.out.println("[" + method.getName() + "]");
            return object;
        }
        
        public static void main(String[] args) {
            RealSubject sub = new RealSubject();
            Subject object = (Subject)Proxy.newProxyInstance(RealSubject.class.getClassLoader(), RealSubject.class.getInterfaces(), new ProxyClass(sub));
            System.out.println(object.getHello());
        }
    
    }

      这个代理可以代理任何类,也可以把Proxy.newProxyInstance方法抽出来,传入一个class对象和该class的实例,返回的就是该实例的代理实例。

      java代理是基于接口的代理。没有接口时是否会导致代理失败?

      spring中自动装载的返回的最终应该也是一个代理类,但是上面返回之前要用cast强制转换类型,spring是如何用反射实现的呢?

        想起来了,好像是通过泛型进行强制转化的(T)Type

       <T> T getBean(Class<T> requiredType) throws BeansException

      就是这样

      (Type)类型转换,cast类型转换,现在如果只知道传进来的参数为Type.class对象,怎么利用反射转换类型?

      public <U> Class<? extends U> asSubclass(Class<U> clazz)

    强制转换该 Class 对象,以表示指定的 class 对象所表示的类的一个子类。检查强制转换的有效性,如果无效则抛出 ClassCastException。如果此方法成功了,它将始终返回对此 class 对象的一个引用。

    此方法的使用场合为:客户端需要“收缩转换” Class 对象的类型,以便将其传递给某个 API,且该 API 对它愿意接受的 Class 对象进行限制。强制转换会产生一个编译时警告,因为强制转换的正确性无法在运行时检查(因为常规类型是通过擦除实现的)。  

      

  • 相关阅读:
    python自学Day01(自学书籍python编程从入门到实践)
    关于要不要转行做程序员的建议
    什么是高并发?
    看了就想收藏的文章链接
    java反射的理解
    Mac执行sh批处理文件出现permission denied
    Error running 'lis [clean]': No valid Maven installation found. Either set the home directory in the configuration dialog or set the M2_HOME environment variable on your system.
    Error running 'Tomcat 8.5.37': Unable to open debugger port (127.0.0.1:55358): java.net.SocketException "socket closed"
    浅谈JS-ES6新特性
    ==和equals的区别
  • 原文地址:https://www.cnblogs.com/guangshan/p/4720401.html
Copyright © 2011-2022 走看看