资讯专栏INFORMATION COLUMN

你需要注意的Java小细节(一)

Sunxb / 2638人阅读

摘要:是一个接口中的代理与中的委托基本类似。而中代理对象是作为被代理对象的一个属性。我们自己的处理逻辑还需要实现是加入了的自己的逻辑调用。成员变量可以看出,中的动态代理体现了中最重要的一点面向接口编程。这样生成的代理类也是一个对象。

调用静态常量不会引起初始化(调用初始化代码块)。但是要调用类的静态方法当然会初始化类了

class Test{
    static{
                  System.out.println("初始化");
     }
        public  final static  String  str="ffffd";
}
public class Main {
public static void main(String[] args) {
System.out.println(Test.str);
}
}

输出ffffd。

2.关于静态代理与动态代理

public class ProxyTest {

    public static void main(String[] args){

            Class clazz = Proxy.getProxyClass(Person.class.getClassLoader(), Person.class);
           System.out.println(clazz);
           System.out.println(Person.class);
    }

}
public interface Person {
    public   void  sayHello();
}

输出:

class com.sun.proxy.$Proxy0
interface main.Person

为什么需要一个classloader,就是因为class是动态生成的。这个class就是代理对象。(也就是被扩展了的Person对象。Person是一个接口)
Java中的代理与OC中的委托基本类似。但是区别不同的是,JAVA中的代理对象包裹着被代理的对象(得到的是被扩展的Person对象)
。而OC中代理对象是作为被代理对象的一个属性。(个人觉得,OC中的代理更能体现面向对象编程,尤其是对多态的理解。)

也就是说,java中的代理最终获得的是代理对象(虽然是Person接口,但是不是我们自己处理逻辑的的那个实现对象),而在OC中获得的是原对象。

Class proxyClass= Proxy.getProxyClass(Person.class.getClassLoader(), Person.class);
         InvocationHandler handler = new MyInvocationHandler();
         Person f = (Person) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler);
         System.out.println(f);

proxyClass的getConstructor得到的是代理类的构造器对象,而不是person的构造器对象。

使用代理可以根据接口动态的生成对象,所谓的动态代理就是根据接口动态生成代理对象而已。

public class ProxyTest {

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

            Class proxyClass= Proxy.getProxyClass(Person.class.getClassLoader(), Person.class);
         InvocationHandler handler = new MyInvocationHandler();
       Person  person= (Person) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler);
      person.sayHello();  
    }
}
public class MyInvocationHandler  implements  InvocationHandler {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      System.out.println("我被调用了!");
        return null;
    }
}

调用这个动态生成对象(扩展了的Person对象)的任何方法都将调用invoke方法。
动态代理:

    public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
             Class proxyClass= Proxy.getProxyClass(Person.class.getClassLoader(), Person.class);
             MyInvocationHandler handler = new MyInvocationHandler();
             //person是一个接口。我们自己的处理逻辑还需要实现:
             handler.setTarget(new PersonImpl());
//person是加入了InvocationHandler的person:
             Person  person= (Person )proxyClass.getConstructor(InvocationHandler.class).newInstance(handler);
             person.sayHello("Jetty"); 
    }
public class MyInvocationHandler implements InvocationHandler {
    private Person person;
    public void setTarget(Person target) {
        this.person = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        new Before().before();
         method.invoke(person, args[0]);//自己的逻辑调用。成员变量person
        return null;
    }
}
public class Before {
    public    void    before(){
        System.out.println("before");
    }
}

可以看出,java中的动态代理体现了java中最重要的一点:面向接口编程。这样生成的代理类也是一个Person对象。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64678.html

相关文章

  • 需要注意java细节(二)

    摘要:要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。为了达到最高效率,可要考虑在内包装。 这些都是一些小问题,但是有助于理解输入输出流。InputStreamReader 中的一个 read()是每次只会从磁盘里面读取一个字节。它会非常频繁的访问磁盘。(想一想,每次只从磁盘读一个字节)InputStreamReader 是字节流通向字符流的...

    firim 评论0 收藏0
  • 实用 | 35个可以提高千倍效率Java代码技巧

    摘要:此举能够使性能平均提高。尽可能使用局部变量调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量实例变量等,都在堆中创建,速度较慢。 showImg(https://segmentfault.com/img/bVbsIIl?w=900&h=383);本文来源 | http://atjf.top/3WLPmG 作者 | 萌小Q 01前沿 代码优化 ,一个...

    NikoManiac 评论0 收藏0
  • 作为我门语言,学习Java时是什么感受?

    摘要:作为技术书籍或者视频,讲解一门语言的时候都是从最底层开始讲解,底层的基础有哪些呢首先是整个,让我们对这门语言先混个脸熟,知道程序的基本结构,顺带着还会说一下注释是什么样子。 2018年新年刚过,就迷茫了,Java学不下去了,不知道从哪里学了。 那么多细节的东西,我根本记不住,看完就忘。 刚开始学习的时候热情万丈,持续不了几天就慢慢退去。 作为技术书籍或者视频,讲解一门语言的时候都是...

    isaced 评论0 收藏0
  • Java入门姿势

    摘要:目录目录下文件是下的执行文件。是一门非常成熟且社区完备的语言。推荐几个社区博客园就这么简单想要入门的话就这么简单。 技术只是工具,文档只是说明书,仅此而已。 写在前面 工作4年有余,盲人摸象般的走过弯路,也投机取巧的领悟到过一些类似编程本质的东西。现在开始我计划回顾下我的编程生涯。在这里分享,同时也是对之前所学的巩固和整理。 理解编程 我先打个比方。人的大脑就像一台电脑主机。比如今天你...

    zhiwei 评论0 收藏0
  • JAVA开发总结

    摘要:前言到今天为止,正好是工作一年了。一年里有过折磨痛苦,有过成就感,一年后很欣慰能看到自己是有所收获的。自己做出了一件很棒的事情完全可以拿去和别人炫耀,比如你用了一个很好的设计模式,比如你优化了一个功能让他快了倍,比如你开发了一个很棒的工具。 前言 到今天为止,正好是工作一年了。一年里有过折磨痛苦,有过成就感,一年后很欣慰能看到自己是有所收获的。记录如下,如有不当,还望指点。 技术 看...

    Reducto 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<