﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-少年阿宾-随笔分类-java基础知识</title><link>http://www.blogjava.net/stevenjohn/category/51102.html</link><description>那些青春的岁月</description><language>zh-cn</language><lastBuildDate>Tue, 09 Oct 2012 14:40:31 GMT</lastBuildDate><pubDate>Tue, 09 Oct 2012 14:40:31 GMT</pubDate><ttl>60</ttl><item><title>Java transient关键字</title><link>http://www.blogjava.net/stevenjohn/archive/2012/10/08/389206.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 08 Oct 2012 13:49:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/10/08/389206.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/389206.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/10/08/389206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/389206.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/389206.html</trackback:ping><description><![CDATA[<p>package com.abin.lee.servlet.important.type;</p>
<p>import java.io.Serializable;</p>
<p>public class LookValue implements Serializable{<br />&nbsp;/**<br />&nbsp; * <br />&nbsp; */<br />&nbsp;private static final long serialVersionUID = -7746631577693804188L;<br />&nbsp;private int id;<br />&nbsp;private String name;<br />&nbsp;private transient String status;<br />&nbsp;<br />&nbsp;public LookValue() {<br />&nbsp;&nbsp;super();<br />&nbsp;}<br />&nbsp;public LookValue(int id, String name, String status) {<br />&nbsp;&nbsp;super();<br />&nbsp;&nbsp;this.id = id;<br />&nbsp;&nbsp;this.name = name;<br />&nbsp;&nbsp;this.status = status;<br />&nbsp;}<br />&nbsp;public int getId() {<br />&nbsp;&nbsp;return id;<br />&nbsp;}<br />&nbsp;public void setId(int id) {<br />&nbsp;&nbsp;this.id = id;<br />&nbsp;}<br />&nbsp;public String getName() {<br />&nbsp;&nbsp;return name;<br />&nbsp;}<br />&nbsp;public void setName(String name) {<br />&nbsp;&nbsp;this.name = name;<br />&nbsp;}<br />&nbsp;public String getStatus() {<br />&nbsp;&nbsp;return status;<br />&nbsp;}<br />&nbsp;public void setStatus(String status) {<br />&nbsp;&nbsp;this.status = status;<br />&nbsp;}<br />&nbsp;<br />}<br /></p><br /><br /><br /><br />
<p>package com.abin.lee.servlet.important.type.test;</p>
<p>import java.io.FileInputStream;<br />import java.io.FileOutputStream;<br />import java.io.IOException;<br />import java.io.ObjectInputStream;<br />import java.io.ObjectOutputStream;<br />import java.io.OutputStream;</p>
<p>import org.junit.Test;</p>
<p>import com.abin.lee.servlet.important.type.LookValue;<br />import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;</p>
<p>public class LookValueTest {<br />&nbsp;@Test<br />&nbsp;public void testLookValue() throws IOException, ClassNotFoundException{<br />&nbsp;&nbsp;LookValue look=new LookValue();<br />&nbsp;&nbsp;look.setId(1);<br />&nbsp;&nbsp;look.setName("abin");<br />&nbsp;&nbsp;look.setStatus("abing");<br />&nbsp;&nbsp;OutputStream out=new ByteOutputStream();<br />&nbsp;&nbsp;FileOutputStream file=new FileOutputStream("data.ser");<br />&nbsp;&nbsp;ObjectOutputStream obj=new ObjectOutputStream(file);<br />&nbsp;&nbsp;obj.writeObject(look);<br />&nbsp;&nbsp;obj.flush();<br />&nbsp;&nbsp;obj.close();<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;look=null;<br />&nbsp;&nbsp;FileInputStream input=new FileInputStream("data.ser");<br />&nbsp;&nbsp;ObjectInputStream oin=new ObjectInputStream(input);<br />&nbsp;&nbsp;look=(LookValue)oin.readObject();<br />&nbsp;&nbsp;oin.close();<br />&nbsp;&nbsp;System.out.println("id="+look.getId());<br />&nbsp;&nbsp;System.out.println("Name="+look.getName());<br />&nbsp;&nbsp;System.out.println("Status="+look.getStatus());<br />&nbsp;}<br />}<br /></p><br /><br /><br />输出结果：<br />id=1<br />Name=abin<br />Status=null<br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/389206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-10-08 21:49 <a href="http://www.blogjava.net/stevenjohn/archive/2012/10/08/389206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java动态代理和cglib动态代理</title><link>http://www.blogjava.net/stevenjohn/archive/2012/06/07/380274.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 07 Jun 2012 13:51:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/06/07/380274.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/380274.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/06/07/380274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/380274.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/380274.html</trackback:ping><description><![CDATA[<p>java动态代理和cglib动态代理在工作中用代理的地方非常多，但一直还没仔细来看代理的原理，今天被同事提到，所以自己开始仔细研究了一下这两者代理都做了些什么工作，并通过编写测试用例的方式来对两种代理原理作理解。<br />在自行看代码之前，初步问了一下朋友，大概解释这两者区别是，java动态代理是利用反射机制生成一个实现代理接口的匿名类，在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包，对代理对象类的class文件加载进来，通过修改其字节码生成子类来处理。这是朋友说的，我并没自己实验过，所以也没映象，所以开始自己动手实践之：<br />java动态代理<br /><br />使用方法：<br /><br />接口：<br /><br />public interface Call {<br />void doCall(String doCall);<br />}<br /><br />public interface Processor {<br />void doProcess(String doProcess);<br />}<br /><br />实现类：<br /><br />public class ServiceImpl implements Call, Processor {<br /><br />public void doCall(String doCall) {<br />System.out.println("doCall");<br />}<br /><br />public void doProcess(String doProcess) {<br />System.out.println("doProcess");<br />}<br />}<br /><br />具体代理Handler:<br /><br />public class ServiceHandler implements InvocationHandler {<br /><br />private Call callService;<br /><br />public ServiceHandler(Call callService) {<br />this.callService = callService;<br />}<br /><br />public Object invoke(Object proxy, Method method, Object[] args)<br />throws Throwable {<br />System.out.println("proxyMethod=" + method.getName());<br />Object obj = method.invoke(this.callService, args);<br />System.out.println("after invoke!");<br />return obj;<br />}<br /><br />}<br /><br />使用java动态代理：<br /><br />public class JdkProxyTest {&nbsp;&nbsp;&nbsp; <br />@Test<br />public void testJdkProxy() {<br />Call call = new ServiceImpl();<br />ServiceHandler handler = new ServiceHandler(call);<br />Call callProxy = (Call) Proxy.newProxyInstance(call.getClass().getClassLoader(), <br />new Class[]{Call.class}, handler);<br />callProxy.doCall("test");<br />}<br />}<br /><br />最终效果就是执行代理接口的doCall方法之前，该方法被ServiceHandler给处理了。<br /><br />通过查看java.lang.reflect.Proxy代码，大致拟了一下它的实现原理：<br />1. 取到new Class[]{Call.class}这里所有接口，通过Class.forName把接口类加载到JVM，放到内部Set里保存，把接口的完善名字保存，带包名的接口名字，并以把这组接口名称数组转换成List作为key，用于下面生成代理类后保存到内部Map的key.也就是相当于这一组的接口名称对应的一个生成的代理类<br />2. 主要是从内存里找是否之前已经生成好了这同一组接口的代理类，如果有就直接拿出。这里第一次是需要新建立的，所以开始创建代理，首先检查代理目标接口的访问控制符是否是默认包级别的，如果是就需要给生成的代理类设置目标接口同样的包名，才能默认访问这种级别下的接口。如果这种有默认访问控制标识符的目标接口，又有不同包名的目标接口，则会报出错误。否则其它情况，是给的无包名的代理类，生成的代理类的默认名称是$Proxy开头加Proxy里标识唯一类名的数字，是静态long型变量，每次生成一次代理类会累加<br />3. 调用ProxyGenerator.generateProxyClass(proxyName, interfaces)动态生成class字节码类，该类相当于是Proxy的子类，实现了需要代理的接口方法，并在每个方法里调用了InvocationHandler的invoke方法，而我们自己实现的InvocationHandler接口类里完成了以反射方式最终对目标业务类的接口方法进行调用。所以此种方式实现的动态代理只能代理接口方法，对具体类的代理不能实现。<br /></p>
<p>&nbsp;</p>
<p><a href="http://hi.baidu.com/dobug/blog/item/493f817e802479340cd7dab9.html">http://hi.baidu.com/dobug/blog/item/493f817e802479340cd7dab9.html</a></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/380274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-06-07 21:51 <a href="http://www.blogjava.net/stevenjohn/archive/2012/06/07/380274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>