JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架
1、类加载器
·简要介绍什么是类加载器,和类加载器的作用
·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader
·类加载器也是Java类,因为其他是Java的类加载器本身也要被类加载器加载,显然必须有第一个加载器不是Java类,这正是BootStrap
·Java虚拟机中的所有类加载器采用具有树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父类级的装载器对像或者采用系统默认类装载器为其父类加载
·类加载器之间的父子关系和管辖范围:
aaarticlea/png;base64,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VU1HajQzdpTn69evv/LKK7Ck6tKlS7D0+fr16/B9ybTzZ6xQnicMyvMpw5s8A3Ecy7KsmaaXJKPLABpv5qWJbluSJIVhOLarbjb7yPMvfvELaChfvnz58uXL165de/PNN8/Ozv74xz/+4Q9/QHlGUJ5PGT7lGfA8T5IkzTDcOB5dEtB4MC9JdMuSJIlSOvwUsDp2lOcbN26wiWA3b9584403/ud//ud3v/vdO++8895777333nuLxQLl+cRBeT5leJbnzWaTZZnv+5IkqZp2vHuYoO1vNIqIroui6LruiMPMlewuz5cvX7569eqbb77529/+9ne/+90f/vCHW7duvf/++3/7298+/PDDDz74AM5CeT5ZUJ5PGc7lmRFFESFEVhTLdY93kTTaDmb7vkqILMtBEIzthtXsKM83b968cuUKTBB7++23b9269d57733wwQcfffTRJ598cufOnY8//vivf/3rpk2hUZ4nDMrzKXMs8gzM53PDMERR1AzjSNdJo3U0GkW6ZYmiqGlaHMdju14Tu8tzkiQ3btz4/e9/v9ls3n///b/+9a8fffTRp59+eu/evS+++OLevXt37tzZnMtzFEUoz6cGyvMpc1zyDKzXa9/3VVWVZNlwHJw+NiXz0sSkVFFVWZZd112tVmO7Wzt7yfMbb7xxdnb2/vvvf/jhh//4xz9u3769Xq+/+uqrLMvu37//5ZdfMoWGeWRl/umf/ukCrwjIfoii2Ox8oiiOnUekL1qfPs8sFgvbtkVRVDXNpBR1+njNSxPTpTC6bFlWOvZaqa1gpWlreb569WqapmdnZ9BuXq1Wn3zyyb17977++utvvvnm4cOHDx48+OKLLz766KO33377xo0bly5dOjs7e/bZZ1sHpDlh1OeCIMj4RFFkWZYoioqqGo5zLGum0dw4NilVCZnNZqZphmHIz3zs7uwrz4vF4m9/+9tqtfr444/v3Llz7969+/fvP3z48PHjx48ePWJ35Pe///3169fP9vs49MCM9kwQBOGMNE1t25ZlWZJlzTRxsjef5oSBblmyokiSZFkW50PLrewrz++8887f//7327dvf/LJJ3fv3v3iiy+yLHv06NHjx48fP3788OHDL7/8crPZ/OUvf/nf//3fX//613Di2MrbiTEfC4IgXLJYLDzPI4QIgqASYtg2TiUb12gYGo6japogCKqqUkrn8/nYbnIY9pLnN99889atW//4xz/u3r372Wefff7559CzvdlsmDzfv39/vV7/4x//+POf/7zZbP7whz/89re/TdP0ypUrY+tvCyM+FQRB+CeOY8dxVFVFqR5LkmezmaIotm1HUXSM3dfN7CjP169fZ/K8Wq3u3bv35Zdf3r9//8GDB6zp/OjRo2+++SbLsi+++OLTTz/9+9//vtlsQKT/+Mc/np2dXbt2DQak+WTEp4IgyBGRZVleqhVV1QzDpBTV+oB6bLpUM00F7vC5JPO2kchh2VGeX79+/UqSvPnmm3/6059u37791VdfPXjw4OHDh3lt3mw2Dx48uH///mazWa/Xn3zyyUcfffThhx9uNps///nPTAUvXbr0/PPPj6fCtYz3UBAEOWLSNPV937Ks79TaNE1KnSDAnU86mhMEpkt1y2J6bJqm53lJkoz9eIdjd3m+fOXKG2+88e67737yySdsOti350DT+f79+19//fWXX375+eeff/bZZ3fu3Ll9+/ZmsynvWPL888//13/910hCXM2ITwVBkMmQJInneZZlwYg1zAPXLQsFu1KMJUkSBIEQYpqm67pJkkyv17oju3Zu37hx+cqVm2+8cevWLQj9+PFjJmzffvvt48ePoWf766+/3mw2sFHJZ5999umnn242G+joLiviT3/60+Hkt43xHgqCIJNltVolSeK6bkGwia4zzZ7qtzq8JGFKTHS9IMaU0iRJlsvl2I+IF3afGnYlSW6+8cY7t259fPt2pTw/evQIOre/+uoraEBvNhtoQ282m/fff7+siD/72c+Gk982RnwqCIKcDiDYYRhSSkGzQbQkSWKyrVuW6VInCJwg4HmbFC9NIJOW60K2NcNQVFWSZXgRYUocBAGKcTN7L6y6devj27e/+vrrR48e5bWNKTRrQ3/xxReff/75er2+e/fuZrOp+2YGPwo94lNBEARZLpdJkgRBQCmllJqmSQghhLDt9iRZVlQVTDNNkEMw0MiCeWlnXU/TyhgM286nwlKXFQWyNJvNIJOGYUC2fd9PkmSxWIx9O4+PfRdW/elPfwJ5/ubhw8fffpuXt7JCf/nll2w7bpgjVqmLzz333BDy28aYjwVBEKSNxWKRnON5Hs1BqpjNZkJnKmNwHIclAQPDwGSWGnPFvvL87rvvfnLnDsgzTNrOKxxME4MF0A8ePGAivV6vP/74403996x4GIQe87EgCIIgp80B5BlCw5oqsG9rmtFMpL/66qv1eg3fDKlTx9F35x7zsSAIgiCnzcHkGVZVMYV+nBNpttoqL9Iwo/vDDz9sEMhnn312xNVWYz4WBEEQ5LQ5pDyDqj3OifSj3Erogkg/ePAAYs9vUVLJWB3doz0TBEEQ5OQ5vDxDyP/n//7fh48effPw4TcPHz589IjtWLLZbJg8f/XVV59++ukHH3zwu9/97urVqy+++OKzzz77H//xH//+7//+4x//+Cc/+Qnr346iCOUZQRAEOR12l+ckSdI0vXXr1u3bt7/++mvYNYzt6Plk17As+/r+/a/v37+fZWzXT5b2vXv3NpvNBx988Mc//hE+HV3mhRde+PnPf/7yyy+/9NJLL7zwwnPPPfef//mfP/7xj//1X//1R+egPCMIgiATY0d5RhAEQRBkAFCeEQRBEIQ7UJ4RBEEQhDt+9KMfPf/887/61a/YRy4q5Pn+/fu3b99eLBbXr1+P4/ill1565ZVXrly58vrrr9+4ceNmjhs3bly/fv31c65fv37jnNdff/3q1auvvvoqxABDy3Ecv/LKK6+88sqlS5cuXrz4/PPP//SnP3322WefffbZ55577r//+78vXrz40ksvXbp06dKlSzAU/fNzXnzxxSiKYFj63/7t34Ig+OEPf/gvh+b/RRAEQZAB+Zd/+ZcgCH7yk5+8+OKLN2/efPfdd+/evfvgwYOiPH/77bdZln366afvvffer3/968uXL4Og/vKXv3zttdcuX7585Wkul4AfX3vttVdfffWVV14BlX3ppZdefvnlS5cuxXEcx/GlS5deeumlixcvRue88MILL774ImjzK+fEOeAUEOmf/exnTNcRBEEQ5Kh57rnnLl68+Nprr/3mN795//331+v1N998UyHP33zzzb179z788MO33377rbfeunnzJmsW3+wMa0P/KgdrZMPv165du5rj2rVrEOZ6DXDW1atXkyS5giAIgiCTIEmS69evv/XWW7du3VqtVl9++eXDhw/Z2iIB/jk7O3v06NH9+/fv3r3797///S9/+cutW7feeeedxWLxzpYsznn77bfffvvtRYm3S5TDNJz1/yEIgiDIkQPad+vWreVy+dFHH63Xa7bLSFGev/3224cPH96/f//zzz+/e/funTt3PumT27dv73wigiAIghw1oGh37tz57LPPvvjiiyzLHj16xHq2v5NnptD5j1sgCIIgCNIrsK8X+5hFhTxvzj8wVd5JG0EQBEGQnqjczlLYIAiCIAjCGSjPCIIgCMId/z8zrV2Fwy/2ngAAAABJRU5ErkJggg==" alt="" />
注意点:用Eclipse的打包工具将ClassLoaderTest输出成jre/lib/ext目录下的shanhw.jar包,在用Eclipse中运行这个类,运行结果显示为ExeClassLoader。此时环境状态是classpath目录有ClassLoaderTest.class,ext/shanhw.jar包中也有ClassLoarderTest.class,这时候,我们就需要了解类加载的具体过程和原理了
类加载器的委托机制:
·当Java虚拟机要加载一个类时,到底派出那个类加载器去加载呢?1、首先在当前线程的类加载器去在加载线程中的第一个类 2、如果类中A引用了类B,Java虚拟机将使用装载A的装载器来装载B 3、还有可以直接调用ClassLoader.loadClass();方法来指定某个类加载器去加载某个类
· 每个类加载器加载时,优先委托给其上级类加载器;
2、编写自己的类加载器
自定义类加载器,例子:写了三个类,1、MyClassLoaderTest.java 2、MyClassLoader.java 3、ClassLoaderAttachment.java
MyClassLoaderTest.java
package com.shanhw.javaEnhance.thirteenthDay; import java.util.Date; /**
* 自定义类加载器
*/
public class MyClassLoaderTest { public static void main(String[] args) throws Exception {
String path = "E:\\Kingsoft Cloud\\Workspaces\\TestExample\\shanhwlib\\ClassLoaderAttachment.class";
Class<?> clzz = new MyClassLoader(path).loadClass("com.shanhw.javaEnhance.thirteenthDay.ClassLoaderAttachment");
Date d = (Date)clzz.newInstance();
System.out.println(d);
} }
MyClassLoader.java
package com.shanhw.javaEnhance.thirteenthDay; import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream; public class MyClassLoader extends ClassLoader{ private static void cypher(InputStream is,OutputStream os) throws Exception{
int i = 0;
while((i = is.read()) != -1){
os.write(i ^ 0xff);
}
} private String classDir; public MyClassLoader(String classDir){
this.classDir = classDir;
} @SuppressWarnings("deprecation")
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try { FileInputStream fis = new FileInputStream(classDir);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
cypher(fis,baos);
fis.close();
byte[] bytes = baos.toByteArray();
return defineClass(bytes, 0,bytes.length);
} catch (Exception e) {
throw new RuntimeException("运行时异常");
}
}
}
ClassLoaderAttachment.java
package com.shanhw.javaEnhance.thirteenthDay; import java.util.Date; public class ClassLoaderAttachment extends Date {
/**
*
*/
private static final long serialVersionUID = 1L; public String toString(){
return "Hello Houwang Shan!";
}
}
3、分析代理类的作用与原理及AOP概念
·生活中的代理:武汉人从武汉代理商手中买联想电脑和直接跑到北京联想总部买电脑,你觉得最终业务的主体业务目标有什么区别吗?基本上一样,解决了核心问题,从代理商那里买,是不是更方便一些?
·程序中的代理:1、要为已经存在的多个具有相同接口的目标类的各个方法增加一些功能,例如:异常处理、日志、计算方法的运行时间、事物管理等等,你准备如何做?2、编写一个目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能代码、如图:
aaarticlea/png;base64,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" alt="" />
3、如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类、还是代理类,这样以后很容易切换,譬如,想要日志功能时,就配置代理类,否则配置目标类,这样,增加系统功能很容易,以后运行一段时间后,又想去掉系统功能也很容易
·AOP
1、系统中存在交叉业务,一个交叉业务就是要切入到系统的一个方面,(安全、事物、日志等要贯穿到好多的模块中,所以它们就是交叉业务)如下所示:
aaarticlea/png;base64,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" alt="" />
2、用具体的程序代码描述交叉业务
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQIAAABmCAIAAACvPwj/AAAFU0lEQVR4nO3aQU/qWBjGcb7/N5iLLIwLQzCBlYlmEDUaE8NylGoiblQyghAxoaW0nLvoTG89bQHbgofX/29hTnor7dO8j0cvlBTw45W++waA7/epBvP5fD6f+4BcwZCn1qAEiGbbtuM4rut6nhf0Qa/BfD7/7psE1qvf7w+Hw/F4bNv2bDbzfT+1BsX+ygWYIJhty7K63e7Ly8toNLJt2/O8cEMoKaWCvweoAaQKZvv8/Pz6+tqyrF6v9/Hx4bouNcAPEsx2vV4/Pj5ut9uPj4+j0Wg6nYa/F/1XA8/zqAGkCmZ7b2+v0WhcXFzc39+/vb05jrOWGoTfnuF1ot9iThszJ9LiGPgjJn80M3MlCu6zUqnUarXT01PLsvr9vm3b5tbAqCdbyKzED5ogZzRjcyUKhqpcLler1Var1el0vlyDMHa8/dEj2lolDXTaK6jPD3fdj7WoREvjJF53rb4l2gZy5RTcfN4aaPnjjyN+gnby6uer9T/WQhKtHkc7ba02HC0tqWmKqUHiovRZ4pmLD6aN/gZqkLj4UqLV46QdWQfB0fJYbw2Wnrn4oIE1WHpm4slLZ2Vjg7L5aIlHTLOhGuTcDbRLm1CDPD8yNxwnamPRvitgNmusQfjqqz8j7fxVvmUdikq0SpzSZ+sLFb+3xXdbYLT1xSlKATUAth01AKgBQA0ARQ0AVWAN5DVEXqKQ4GjZFFMDeY9VXqKQ4GiZUYNk8hKFBEfLjBokk5coJDhaZgXUQN5jlZcoJDhaHuwGyeQlCgmOlhk1SCYvUUhwtMyoQTJ5iUKCo2VGDZLJSxQSHC0z3j5LJS9RSHC0bPgwBUANAGoAKGoASTLPJzWAiRZ/XqGUIs/lqAGMkzbxaaflvxw1gHGicx+thPav7AYQS5u0xBpEF1pbMl+RGsAsq9cgvmlku1zeGmi3sni9+sH8J/CyW/ey0aGKr9MW0a/ZBFdnN4BZtJ6EB+OLaJdyXo4awCzxyV7QB2oAsbRh02qgbQI5J5MaANQAoAaAogaAogaAogaAogaAogaAogaAogaAogaAogaAKqoGpaRPwGqLTTLtfuJWuUPT7lkwdgOAGgDUAFDUAFDUAFDUAJJknk9qABMlTlr0f5AT5bkcNYBx0iY+7bT8l6MGME507hPfT2Q3gHDapCXWILrQ2pL5itQAZlm9BvFNI9vl8tZAu5XF69UP5j+Bl926l40OVXydtoh+zSa4OrsBzKL1JDwYX0S7lPNy1ABmiU/2gj5QA4ilDZtWA20TyDmZ1ACgBgA1ABQ1ABQ1AFRRNRBcD6L9BIXtBoKfKdHEowbLEU08arAc0cQr8k9kwc+UaLKxGyxHNPGowXJEE48aLEc08ajBckQTj7fPliDaT8CHKQBqAFADQGWoASAVNQBKlUqlVqudnp5alpVag8lk8vr6end3d3V1dXR0VK/X9/f3d3d3K5VKuVz+C9hav3792tnZ2dvbazQaFxcX9/f3b29vjuPoNfB937btwWDw8PDQbrdbrdbh4WGj0Tg4OKhWq/vAlqtWq/V6/fj4uN1uPz4+jkaj6XSaUIPpdPr+/v709NTpdNrt9uXl5dnZ2cnJSbPZ/BvYcs1m8/z8/Pr62rKsXq/38fHhuu58Pv9Tg6AJs9lsMpkMh8Pn5+dut3t3d9fpdG7+9w+wtW5ubm5vby3L6na7Ly8vo9HItm3P8xJq4Pu+67qTyWQ8Hg+Hw8Fg8BrxL7C1ghnu9/vD4XA8Htu2PZvNwt+I/tQgbILnea7rOo5jA+I4juO6rud5vu+HW8GnGgRNCMoASBUMuf7+2pfejQNEogaA+g3Nn2hKwV9NXwAAAABJRU5ErkJggg==" alt="" />
3、交叉业务的编码问题即为面向方面的编程(Aspect Oriented Program 简称AOP),AOP的目标就是使用交叉业务模块儿化。可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码运行效果是一样的,如下所示:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAP0AAABiCAIAAAAUZ0I9AAAFC0lEQVR4nO3aT0/qWBjH8b7/dzAXWRgWhmACKxPJIEgwJqTLUQqJsFHICLQRElpKW+6iM9x6+scqp6enfX6fhWkKHp4r31O5oHIEoEfJewCAHHzq3vM8z/NcgBLxq47tXgEoF9M0LcuybdtxHH8DsN17npf3kACcLZdLXdc3m41pmofDwXXd2O75vooCyIUfs6Zp0+l0Pp8bhmGapuM4p0u+cjwe/df06B5Kw4+53+8Ph0NN0xaLxXa7tW0b3UNRpanUj7nZbLbbbVVVZ7OZYRj7/f70Uue/7h3HQfcgWGRvp5Nxr9pTrqwoSq1Wa7Vag8FgMpms12vLstA95C8u8bi7fWtlRVGq1Wqj0ej1epqmLZdL0zTRPeQvGHpwDzC3/vh6X6lU6vV6t9sdjUboHqTA9BbZffCA2R5pFkf3IKP03Yd/LXy5Mp/umcdOPk5/8vw7YNnCLfuD7pmv4roH4I7ZGKeT4YPg5km/MroHGYVTTtgA6B7Kg0mO6Z65zKfvE90DRegeKEL3QBG6B4rQPVDEufvzN0bWW+vM9cNvJ4tU6OGlwrN7LtFn+qyc3w2vpc589DO/Helz6z78ZurpfPDWuPdfg/fk/6/kNCGzWkZzRir08BLK5Hof+cR8eSZ8zB2XCQXMGYnXjxfRHyXpPnKRLHCZMPmm7PAa/stbKUD3ck2YAN1zlG33yS9Jw994FN79dyfMsZgzhxf2Qy6ETLo/hp6SuIbCa4rp/mcTKp9lN2ek83+8eU0uIZ7dAxQFugeK0D1QhO6BInQPFKF7oIhz97lvjNwHSCDzbNTw7D735zX3ARLIPBtB6F4QmWcjCN0LIvNsBHHrPvfnNfcBEsg8G0243gsi82wEoXtBZJ6NIHQviMyzEYTuBZF5NoLwuZU4Ms9GDf5OAShC90ARugeK0D1QhO6BInQPFKF7oAjdA0XoHihC90ARugeKMvm7tIQDkWSbJyzNhLLNXA643gNF6B4oQvdAEboHitA9UJTJ+zl5yX2ABDLPRhDn633uz27uAySQeTZq0L04Ms9GDboXR+bZqOH//9rcn93cB0gg82yk4HovjsyzUYPuxZF5NmrQvTgyz0YNuhdH5tmowedWgsg8G0H4OwWgCN0DRegeKEL3UDYpP11F9yCpyN5OJ5UYKVdG9yCpuMTj7vatldE9SCoYenAPMLfieg/lwfQW2X3wgNkeaRZH9yCj9N2Hfy18uTKf7pnHTj5Of/L8O2DZwi37g+6Zr+K6B+CO2Rink+GD4OZJvzK6BxmFU07YAOgeyoNJjumeucyn7xPdA0Xf7h6gNNA9UFStVhuNRq/X0zQttvvdbvf+/j4ejx8fH29vb5vN5tXV1eXlZbVarVQqfwEUx69fvy4uLmq1WqvVGgwGk8lkvV5blsV277quaZqr1erl5UVV1W63e3Nz02q1rq+v6/X6FUDR1Ov1ZrPZbrdVVZ3NZoZh7Pf7iO73+/3Hx8fr6+toNFJV9eHh4f7+/u7urtPp/A1QNJ1Op9/vD4dDTdMWi8V2u7Vt2/O8P9376R8Oh91up+v629vbdDodj8ej0ejpf/8AFMfT09Pz87OmadPpdD6fG4ZhmqbjOBHdu65r2/Zut9tsNrqur1ar94B/AYrDj3a5XOq6vtlsTNM8HA6nFzl/uj+l7ziObduWZZkAxWdZlm3bjuO4rnu62H/q3k/frx+gNPyq2Q+2vvUxGEA5oHug6Ddt383oUVY+YAAAAABJRU5ErkJggg==" alt="" />
4、使用代理技术正好可以解决这种问题,代理是实现AOP功能的核心和关键技术
·动态代理技术
1、要为系统中的各种接口的类增加代理功能,那将需要太多的代理类,全部采用静态代理的方式,将是一件非常麻烦的事情,写成成百上千的代理类,是不是太累了
2、JVM可以在运行期动态生成类的字节码,这种动态生成的类,往往被用作代理类,即动态代理
3、JVM生成动态类必须实现一个或者多个接口,所以JVM生成的动态类只能用作具有相同接口的目标类的代理
4、CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理,那么可以使用CGLIB库
5、代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个位置加上系统功能代码:
******1、在调用目标方法之前 2、在调用目标方法之后 3、在调用目标方法前后 4、在处理目标方法异常的catch块中
·分析JVM动态生成的类
·1、创建实现了Collection接口的动态类和查看其名称,分析Proxy.getProxyClass方法的各个参数
·2、编码列出动态类中的所有构造方法和参数签名
·3、编码列出动态类中的所有方法和参数签名
·4、创建动态类的实例对象
1、用反射获得动态方法
2、编写一个简单的InvocationHandle类
3、调用构造方法创建动态类的实例对象,并将编写的InvocationHandler类的实例对象传进去
4、打印创建的对象和调用的对象的没有返回值和getClass方法,演示调用其他返回值的方法报告了异常
5、将创建动态类的实例对象的代理改成匿名内部类的形式编写,锻炼习惯匿名内部类
1、例子:ProxyTest.java
package com.shanhw.javaEnhance.thirteenthDay; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection; public class ProxyTest { /**
*
*/
public static void main(String[] args) throws Exception{
Class clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
System.out.println("----------Constructors:----------");
Constructor[] constructors = clazzProxy.getConstructors();
for(Constructor constructor:constructors){
String consName = constructor.getName();
StringBuilder str = new StringBuilder(consName);
str.append('(');
Class[] clazzParas = constructor.getParameterTypes();
for(Class clazzPara : clazzParas){
str.append(clazzPara.getName()).append(',');
}
if(clazzParas.length != 0){
str.deleteCharAt(str.length()-1);
}
str.append(')');
System.out.println(str);
}
System.out.println("----------Methods:----------");
Method[] methods = clazzProxy.getMethods();
for(Method method:methods){
String consName = method.getName();
StringBuilder str = new StringBuilder(consName);
str.append('(');
Class[] clazzParas = method.getParameterTypes();
for(Class clazzPara : clazzParas){
str.append(clazzPara.getName()).append(',');
}
if(clazzParas.length != 0){
str.deleteCharAt(str.length()-1);
}
str.append(')');
System.out.println(str);
}
System.out.println("----------创建实例对象:----------");
Constructor constructor = clazzProxy.getConstructor(InvocationHandler.class); Collection collection = (Collection)constructor.newInstance(new InvocationHandler(){ @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return null;
}});
Collection proxy = (Collection) Proxy.newProxyInstance(Collection.class.getClassLoader(),
new Class[]{Collection.class},
new InvocationHandler(){
ArrayList arrayList = new ArrayList();
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
return method.invoke(arrayList, args);
}
});
proxy.add("a");
proxy.add("a");
proxy.add("a");
System.out.println(proxy.size());
}
}
内部的原理:猜想分析动态生成的类的内部代码?
·动态生成的类实现了Collection接口(可以实现若干接口),生成的类有Collection接口中的所有方法和一个如下接受InvocationHandler参数的构造方法
·构造方法接受一个InvocationHandler对象,接受对象干什么了呢?该方法内部类的代码会是怎么样的呢?
·实现的Collection接口中的各个方法的代码又是怎么样的呢?InvocationHandler接口中定义的invoke方法接受的三个参数是什么意思呢?
aaarticlea/png;base64,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" alt="" />
·让动态生成的类,成为目标类的代理
1、分析动态代理的工作原理图:
aaarticlea/png;base64,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" alt="" />
2、怎样将目标类传进去?
****1、在InvocationHandler实现类中创建目标类的实例对象,可以看运行效果和加入日志代码,但是没有实际意义
****2、为InvocationHandler实现类注入目标类的实例对象,不能采用匿名内部类的形式了
****3、让匿名的InvocationHandler实现访问外面方法中的目标类实例对象的final类型的引用变量
3、将创建代理的过程改为一种更优雅的方式,eclipse重构出一个getProxy方法绑定接受目标同时返回代理对象,让调用者更懒惰,更方便,调用者甚至不用接触任何代理的API
4、把系统功能代码模块化,即将切面代码也改为通过参数形式提供,怎样把要执行的系统功能代码从参数形式提供?
****1、把要执行的代码装到一个对象的某个方法里,然后把这个对象作为参数传递,接收者只要调用这个对象的方法,即等于执行外界提供的代码。
****2、为bind方法增加一个Advice参数。
·实现类似Spring的可配置的AOP框架
(实现思路):1、工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换,其getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件中对应的类名不是ProxyFactoryBean,则直接返回该类的实例对象,否则,返回该类实例对象的getProxy方法返回的对象
2、BeanFactory的构造方法接收代表配置文件的输入流对象,配置文件格式如下:xxx = java.util.ArrayList #xxx = cn.shanhw.ProxyFactoryBean xxx.target=java.util.ArrayList xxx = advice.shanhw.MyAdvice
·ProxyFactoryBean充当封装生成动态代理的工厂,需要为工厂类提供哪些配置参数信息:1、目标 2、通知
·编写客户端应用 1、编写实现Advice接口的类和配置文件中进行配置 2、调用BeanFactory获取对象
JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架的更多相关文章
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Jav ...
- java 实现类似spring的可配置的AOP框架
一.工厂类BeanFactory: 1.工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换. 2.getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符 ...
- JAVA基础知识之JVM-——自定义类加载器
JVM中除了根加载器之外其他加载器都是ClassLoader的子类实例, 可以通过扩展ClassLoader的子类,通过重写方法来实现自定义的类加载器. ClassLoader中有两个关键的方法如下, ...
- 分析JVM动态生成的类
总结思考:让jvm创建动态类及其实例对象,需要给它提供哪些信息? 三个方面: 1.生成的类中有哪些方法,通过让其实现哪些接口的方式进行告知: 2.产生的类字节码必须有个一个关联的类加载器对象: 3.生 ...
- 黑马程序员_java基础笔记(13)...类加载器和代理
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 1,类加载器.2,代理. 1,类加载器. Java虚拟机中可以安装多个类加载器,系 ...
- JAVA基础_类加载器
什么是类加载器 类加载器是Java语言在1.0版本就引入的.最初是为了满足JavaApplet需要.现在类加载器在Web容器和OSGI中得到了广泛的应用,一般来说,Java应用的开发人员不需要直接同类 ...
- Java内存管理-掌握自定义类加载器的实现(七)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇分析了ClassLoader的类加载相关的核心源码,也简单介绍了ClassLoa ...
- Java内存管理-掌握虚拟机类加载器(五)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇介绍虚拟机类加载机制,讲解了类加载机制中的三个阶段,分别是:加载.连接(验证.准 ...
- [转载] Java高新技术第一篇:类加载器详解
本文转载自: http://blog.csdn.net/jiangwei0910410003/article/details/17733153 首先来了解一下字节码和class文件的区别: 我们知道, ...
随机推荐
- rabbitmq之rpc
环境:windows或者Linux,python3.6,rabbitmq3.5要求: 可以对指定机器异步的执行多个命令 例子: >>:run "df -h" --hos ...
- 融合模型Aggregation
从一堆弱分类器融合得到强分类器. 比如假设现在你只能水平或竖直线分割,那么无论如何都分不好,但是假设组合三次分割,就会得到如图所示的一个较好的分割线. 再比如,PLA 融合后有large margin ...
- 出现java.lang.IllegalArgumentException异常
严重: Servlet.service() for servlet [office] in context with path [/office] threw exception [Request p ...
- 1024Studio官网
一.开发背景 在工作室成立之后,一直就想为工作室建设一个网站,这次乘着暑假有足够的空余时间,开始着手建设我们1024studio的官方网站. 二.系统设计 1.系统目标 根据网上查找的相关资料以及与工 ...
- STL之set&multiset使用简介
关于set,必须说明的是set关联式容器.set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序.应该注 ...
- 二分查找树按照key值划分
#include <iostream>#include <vector>#include <algorithm>#include <string>#in ...
- 学习go语言第一天
今天先下载了go语言,FQ去下载的,一开始想用eclipse,然后下载了go插件,结果出现错误,我英语水平有限,就换了liteIDE,感觉还不错,go语言环境变量因为我是msi安装的,好像可以不用自己 ...
- sass mixin 持续更新
控制多行显示省略号... //文字溢出省略号@mixin coveText($num:1){ @if $num == 1{ white-space: normal; overflow: hidden; ...
- eclipse安装使用jetty
安装: 直接从eclipse中的eclipse_market中下载即可,关键说下配置项目的访问路径:
- vue组件中使用iframe元素
需要在本页面中展示vue组件中的超链接,地址栏不改变的方法: <template> <div class="accept-container"> <d ...