银行转帐案例(为了方便,本身为本身动态代理,没有再写类)
html
写了一个与sun公司相同类名的类,加载器加载时,会自动去寻找sun公司下类的方法,结果发现,没有show()方法,就会报错。
java
如今写了一个类加载器,该类加载器的做用是,指定加载哪个类(调用构造方法时会传入调用类的地址)
ide
再经过反射得到方法的对象。
this
package sun.security.ec; public class ECDHKeyAgreement { public void show(){ System.out.println("哈哈~"); } }
package cn.itcast.classloader; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class MyClassLoader extends ClassLoader { private String rootDir; public MyClassLoader(String rootDir) { this.rootDir = rootDir; } @Override public Class<?> findClass(String name) throws ClassNotFoundException { String extname = name.replace(".", "\\"); String filename = rootDir + "\\" + extname + ".class"; ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { InputStream is = new FileInputStream(filename); int len = -1; byte[] b = new byte[1024]; while ((len = is.read(b)) != -1) { baos.write(b, 0, len); } baos.flush(); baos.close(); is.close(); byte[] data = baos.toByteArray(); return defineClass(name, data, 0, data.length); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } }
package sun.security.ec; import java.lang.reflect.Method; import cn.itcast.classloader.MyClassLoader; public class Test { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { /*ECDHKeyAgreement ea = new ECDHKeyAgreement(); ea.show();*/ MyClassLoader loader = new MyClassLoader("E:\\代码\\160226\\day22-classloader\\bin\\"); Class<?> clazz = loader.findClass("sun.security.ec.ECDHKeyAgreement"); Method method = clazz.getMethod("show");//反射得到method对象 method.invoke(clazz.newInstance());//执行method } }
动态代理,装饰模型的区别:http://www.cnblogs.com/jaredlam/archive/2011/11/08/2241089.htmlspa