位置: 首页 > 苏州JAVA > 张家港专业java培训课程
张家港专业java培训课程
预约试听
张家港专业java培训课程
其然IT 教育师资

张家港专业java培训课程

张家港专业java培训课程

Java开发的应该 如何掌握上述相关技术?

张家港专业java培训课程

Java开发的应该如何掌握上述相关技术?

一:首先,有这样的一种情况很常见,对于想自学Java开发的人来说,他们 大多数都是非常盲目的,不知道自己改如何入手,很多人在网上找一些视频,然后疯狂的过视频,很快就把一块内容都学完,他们理解的学完了就是视 频看完了,但是让他们动手去做东西却做不出来,而我的理解学完了就是自己能写出东西,所以对于初学者来说一定不能盲目,要有自己的规划,不然 就是浪费时间白忙活。

二:既然是学习Java开发专业技术,我个人的建议是,一定要有一个能指导 你的人,不能都靠自己闭门造车,这样的行为并不聪明,结识一位这方面的人才,时不时去问问人家问题,不然你可能会发现一个小问题能困扰你一天 ,**后还不知道是什么原因。

三:学习Java开发技术,不能跟学数学语文一样对待,比较刚接触代码是不 容易记住的,所以要掌握上述的技术,你还要知道学习Java开发技术有哪些“坑”。对于学习方法这块是尤为重要的,怎么学才能让你学完了能记住之 前学的那些,不至于学完了就忘,这个问题值得你学习之前去思考的。

四:根据我多年的学习情况来看,你平时一定要养成好的学习习惯,就说我 自己吧!我就喜欢把自己曾经遇到的问题整理在电脑的日记本上,然后我会搜集一下博客相关的Java技术文章,一些我认为比较有用的网站,以后都能 用的上,这是我个人的学习习惯,相信我,如果你想走的更远,一定要养成习惯。

**后给大家一些详细的学习安排路线:

Java基础:Java基础语法、数组、类与对象、继承与多态、异常、范型、集 合、流与文件、反射、枚举、自动装箱和注解。

数据库:mysql、oracle

Javaweb:HTML与CSS网页开发基础、Java脚本语言、搭建开发环境、JSP基 本语法、JSP内置对象、JavaBean技术、Servlet技术、Ajax技术

框架:Struts2、Hibernate、Spring、SpringMVC、mybatis

java互联网开发工程师


张家港专业java培训课程

设计模式之代理模式


>

代理模式在我们生活中是十分常见的,例如,帮我打包午饭,帮我拿一下快递,这些是我们日常的代理模式。其中你是委托人,代理人是你朋友,而事件就是打包午饭、拿快递。

简介

代理模式的定义:PRovide a surrogate or placeholder for another object to controlaccess to it(为其他对象提供一种代理以控制对这个对象的访问)。

模式中的角色与职责

Subject: 抽象主题类   该类的主要职责是申明真是主题与代理的共同接口方法,该类既可以是个抽象类也可以是个接口(具有抽象方法)。 RealSubject: 真实主题类   该类也称为委托类或者被代理类,该类定义了代理所表示的真是对象(也就是实现了抽象方法),由其执行具体的业务逻辑。 ProxySubject:代理类   这个类的对象持有一个对真实主题的引用,在这个类所实现的接口方法中调用真实主题类中相应的方法执行,这样就实现了代理的目的。 Client:客户类   也就是使用代理类的类型,客户类**代理类间接地调用了真实主题类中定义的方法。

代理模式可以分为静态代理和动态代理。

静态代理

具体实现代码如下:

public class javaDemo { public static void main(String[] args) { ProxySubject proxySubject = new ProxySubject(new RealSubject()); proxySubject.request(); } } interface Subject { abstract void request(); } class RealSubject implements Subject { @Override public void request() { // TODO Auto-generated method stub System.out.println("To do something."); } } class ProxySubject implements Subject { private RealSubject mRealSubject; public ProxySubject(RealSubject realSubject) { super(); // TODO Auto-generated constructor stub mRealSubject = realSubject; } @Override public void request() { // TODO Auto-generated method stub mRealSubject.request(); } }

**示例代码相信大家对静态代理有了一定的理解。 1.委托人和代理人都可以完成同样一件事。(实现同一个接口) 2.委托人告诉代理人去完成这件事,代理人才去做这件事。(代理人需要持有委托人引用)

动态代理

同样是带午饭的场景,但是自己写代码写到忘记了时间,一抬头发现同事都走光了,那么谁能帮自己带个饭呢?在等待的过程中是谁先出现,张三还是李四?(程序需要动态创建一个对象)而且**重要的是出现的那个同事要能帮自己带饭才行(上步创建的对象需要实现Subject接口)

public class JavaDemo { public static void main(String[] args) { final Subject realSubject = new RealSubject(); //**个参数,目标的装载器 //第二个参数,目标接口,为每个接口生成代理 //第三个参数,实现了InvocationHandler接口,当你一调用代理,代理就会调用InvocationHandler的invoke方法 Subject subject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub //调用目标方法 return method.invoke(realSubject, args); } }); subject.request(); } } interface Subject { abstract void request(); } class RealSubject implements Subject { @Override public void request() { // TODO Auto-generated method stub System.out.println("To do something."); } }

InvocationHandler相当于一个处理器,在invoke方法中我们能够操作真实对象,可以附加其他操作。而我们**Proxy.newProxyInstance(..)方法生成代理。实现InvocationHandler接口并附加操作后,获取代理角色。

动态代理的重点在于Proxy.newProxyInstance(),有兴趣的同学可以看看里面的实现源码。主要步骤是: 1.ProxyGenerator.generateProxyClass方法负责生成代理类的字节码,生成逻辑比较复杂,有兴趣的同学可以继续分析源码 sun.misc.ProxyGenerator; 2.native方法Proxy.defineClass0负责字节码加载的实现,并返回对应的Class对象。 3.利用clazz.newInstance反射机制生成代理类的对象;

而动态代理是相当强大的,下面我们自己看一下Retrofit的动态代理例子:

Retrofit是现在**火的Android网络请求框架之一,相信大家或多或少都有了解过。我们看一下Retrofit怎么使用动态代理模式的。

1.创建一个请求方法的接口:

public interface HttpService { @FormUrlEncoded @POST(URLs.Login) Call<JSObject> login(@FieldMap() Map<String, String> maps); }

2.生成Retrofit对象,并且创建一个实现了GitHubServiece接口的实体类:

Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .build(); HttpService mHttpService = retrofit.create(HttpService.class);

上面的大家用过Retrofit都会很熟悉,我们看一下create()的代码:

public <T> T create(final Class<T> service) { Utils.validateServiceInterface(service); if (validateEagerly) { eagerlyValidateMethods(service); } return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service }, new InvocationHandler() { private final Platform platform = Platform.get(); @Override public Object invoke(Object proxy, Method method, Object... args) throws Throwable { // If the method is a method from Object then defer to normal invocation. if (method.getDeclaringClass() == Object.class) { return method.invoke(this, args); } if (platform.isDefaultMethod(method)) { return platform.invokeDefaultMethod(method, service, proxy, args); } ServiceMethod serviceMethod = loadServiceMethod(method); OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args); return serviceMethod.callAdapter.adapt(okHttpCall); } }); }

经过上面对动态代理的理解,对create()封装的代码,一看就非常清楚,就是动态代理模式嘛。


了解了静态代理和动态代理可能大家会想,在代码层面上本来就可以自己完成,为什么要交给其他类完成呢?这样不是多此一举吗?但在实际开发中,使用代理模式的作用有:

解耦:这是设计模式解决的基本问题。在这里委托类只需要做好自己的部分工作,然而一些额外的事情可以交给代理类完成。如自己准备结婚,但是不可能自己去一手一脚去准备整个婚礼,我们自己只需要请婚庆公司,定好价钱然后婚庆公司就能帮我们解决整场婚礼的大小事,我们自己不需要婚庆公司怎么完成,这样是不是将我与结婚事件进行了解耦。

拦截、扩展:代理类在实现接口方法的时候,除了调用委托类方法外,还可以在不修改委托类的情况下,增加一些其他需求功能。如我们试想在实现类满足要求时,我们可以直接使用实现类,但是实现类再满足不了需求的时候,我们就得扩展,但是根据开闭原则,我们不能直接修改实现类的代码,这样我们可以**代理类可扩展功能;另外就是我们权限分配,我们可以根据对申请权限的对象进行拦截,根据不同的角色条件做判断,然后再分配对用的权限。


相关推荐:


苏州JAVA培训   苏州JAVA培训班   苏州JAVA培训机构

苏州其然软件开发培训

进入机构首页
苏州其然软件开发

上课地址:苏州市昆山市震川西路111号名仕大厦

预约试听

倒计时:
11 : 58 : 41
其他试听课程
机构全部课程

学校课程导航