课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > Java SE功能/API介绍
  • Java SE功能/API介绍

    发布:昆明Java培训      来源:达内新闻      时间:2016-02-28


  • 昆明java培训机构多年的Java开发经验会告诉大家,从发展性的角度来看,以下这些Java SE 功能/API,开发者最好停止使用。

    Reflection

    Bytecode manipulation

    ThreadLocals

    Classloaders

    Weak/Soft references

    Sockets

    1.Reflection

    Reflection即反射,在许多流行的库里面都有反射机制,比如SpringHibernate 。通过对业务代码进行反思,我建议大家避免使用反射。

    下面列出昆明java培训小编反对使用的原因:

    首先涉及到代码可读性/工具支持。打开IDE并且在Java 代码里找到相互依赖关系。使用relection替换方法调用,并且试着重复该步骤。事情变的愈发不可收拾,正常情况下都应该封装好了再修改状态。

    下面来看看昆明java培训给出的具体代码示例:

    Java代码

    public class Secret {

    private String secrecy;

    public Secret(String secrecy) {

    this.secrecy = secrecy;

    }

    public String getSecrecy() {

    return null;

    }

    }

    public class TestSecrecy {

    public static void main(String[] args) throws Exception {

    Secret s = new Secret("TOP SECRET");

    Field f = Secret.class.getDeclaredField("secrecy");

    f.setAccessible(true);

    System.out.println(f.get(s));

    }

    }

    通过查看以上昆明java培训机构给出的代码可以得知,方法getDeclaredField() 参数只有在运行时才可以被发现。而你也清楚,运行时产生的bug总比不执行脚本要更加棘手。

    其次,反射调用优化是由JIT 执行的,一些优化可能需要花费很长时间才能得到应用,而有些优化甚至都得不到应用,所以关于反射的性能优化有时会被数量化。但在一个典型的业务应用程序中——你可能不会真正意识到这些性能开销。

    总之,开发者应该通过AOP合理地在业务层使用反射,除此以外,你最好离它远远的。

    2.Bytecode manipulation.

    字节码操作,如果我看到你在Java EE应用程序里直接使用CGLIBASM ,我可能会立即跑开。

    最糟糕的事情莫过于在编译期间没有任何可执行的代码。实际上,当产品在运行时,你根本不知道哪块代码在运行。所以,当你遇到麻烦时,会自然地把错误抛给运行时故障排除和调试,不过这样反而会更麻烦。

    3.ThreadLocals

    这里有两个不相关的原因,当我在业务层代码里看到ThreadLocals时会颤抖。首先,在ThreadLocals 的帮助里,你可能会看到许多变量的使用都没有通过方法调用链来明确地向下传递。这在某些场合下是有用的,但当你一旦粗心,你会在代码里构建许多意料不到的依赖关系。

    第二个不相关的原因与我日常的工作相关,在ThreadLocals里存储数据会引发内存泄露。最起码我遇到的Permgen 泄露有十分之一都是使用ThreadLocals造成的,在结合了类加载器和线程池后,“java.lang.OutOfMemoryError:Permgen space”异常可能就马上出现了。

    4.Classloaders

    首先,类加载器是一个复杂的野兽。你必须先了解它的层次结构、委托机制、类缓存等等。即使你认为自己已经掌握了,它可能还是不能正常工作。最终将导致一个类加载器泄露问题。因此我只能建议你将这个任务留给应用服务器处理

    5.Weak/Soft references

    现在,你应该更好的理解Java 的内部方法。使用软引用来重写所有的缓存并不明智。我知道,当你手上拿着锤子的时候,就会到处寻找钉子。可对于锤子来说,缓存并不是个好钉子。为什么?基于软引用构建缓存可能是如何委托一些复杂因素到GC而不是通过自身实现的一个好例子。

    下面昆明java培训举个缓存的例子,你使用软引用来创建数据,当内存被耗尽时,GC 进入并且进行清理。但是,缓存中被删除的对象并未得到你的控制,而且很有可能在下一次的cache-miss中重新创建。如果内存仍然不足,你可以触发GC 进行再次清理。你可能已经看出了整个运行过程的恶性循环,整个应用程序就变成了CPUGC不断运行的状态了

    6.Sockets

    普通老式的java.net.Socket实在是太复杂,以至于很难弄正确。我觉得阻塞性是其根本性的缺陷。当你编写一个典型的带有Web 前端的Java EE应用程序时,应用程序需要高并发度来支持大量的用户,而你现在最不想发生的是不具有可扩展的线程池坐等阻塞套接字。

    目前昆明java培训看到有许多精彩可用的第三方库,使用它们可以更好的完成任务,比如Netty,开发者不妨尝试下。

    推荐文章

上一篇:Java数组转换为List的方法

下一篇:达内昆明春城路中心第十四届JAVA&UI项目大赛

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56