黑马程序员_java高级篇代理Day14(下)
来源:互联网 发布:网红的女装淘宝店 编辑:程序博客网 时间:2024/05/17 04:36
----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------
黑马程序员_java高级篇代理Day14(下)
这篇主要是用代码来试看看代理类的实现,以及AOP编程,BeanFactory的应用
#代理类的实现#
package day13;import java.awt.event.InvocationEvent;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 SecurityException, Exception {// TODO Auto-generated method stub Class classProxy=Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class); Constructor[] constructors = classProxy.getConstructors(); System.out.println("-----classProxy得到构造开始--------"); for(Constructor constructor: constructors) { String name=constructor.getName(); StringBuilder strBd=new StringBuilder(name); strBd.append("("); Class[] classPars=constructor.getParameterTypes(); for(Class classPar:classPars) {strBd.append(classPar.getName()).append(','); } if(classPars.length!=0&&classPars!=null) strBd.deleteCharAt(strBd.length()-1); strBd.append(")"); System.out.println(strBd.toString()); } System.out.println("-----method开始--------"); Method[] Methods = classProxy.getMethods(); for(Method method: Methods) { String name=method.getName(); StringBuilder strBd=new StringBuilder(name); strBd.append("("); Class[] classPars=method.getParameterTypes(); for(Class classPar:classPars) {strBd.append(classPar.getName()).append(','); } if(classPars.length!=0&&classPars!=null) strBd.deleteCharAt(strBd.length()-1); strBd.append(")"); System.out.println(strBd.toString()); } System.out.println("-----creat object开始--------"); //1,构造方法 Constructor constructor = classProxy.getConstructor(InvocationHandler.class); class myinvocation implements InvocationHandler {public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubreturn null;} } //new 对象 Collection c= (Collection) constructor.newInstance(new InvocationHandler(){public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubreturn null;} }); //,当我们程序就到这时,调用方法应注意,当我们调用有返回值得方法时,会报错! c.clear(); //内部类要想访问target,必须将其定义为final的 final ArrayList target=new ArrayList(); //其实 getProxy是我们重构出来的,这个代码也可以放在这里,只是这样看起来更加好 Collection c1 = (Collection) getProxy(target,new MyAdviser()); //新建了对象后,我们就可以加了,同时这个对象就是ArrayList c1.add("s"); c1.add("dsd"); c1.add("ds"); System.out.println(c1.size());}public static Object getProxy(final Object target,final Advise advise) {Collection c1=(Collection) Proxy.newProxyInstance(/*Collection.class.getClassLoader()*/target.getClass().getClassLoader(),/*new Class[]{Collection.class}*/target.getClass().getInterfaces(),new InvocationHandler(){ public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubadvise.beforeMethod(method); //Long startTime=System.currentTimeMillis();Object val= method.invoke(target,args);advise.afterMethod(method);//Long endTime=System.currentTimeMillis(); return val; } });return c1;}}
package day13;import java.lang.reflect.Method;public interface Advise {public void beforeMethod(Method m);public void afterMethod(Method m);}
#实现了Advise接口的类#
package day13;import java.lang.reflect.Method;public class MyAdviser implements Advise {/** * @param args */ long startTime=0;public static void main(String[] args) {// TODO Auto-generated method stub}public void afterMethod(Method m) {// TODO Auto-generated method stubLong endTime=System.currentTimeMillis();System.out.println(m.getName()+":"+(endTime-startTime));}public void beforeMethod(Method m) {// TODO Auto-generated method stub startTime=System.currentTimeMillis();}}
#使用AOP Bean模仿Spring原理#
#AopTest#
package day13;import java.io.IOException;import java.io.InputStream;public class AopTest {/** * @param args * @throws Exception */public static void main(String[] args) throws Exception {// TODO Auto-generated method stubInputStream is=AopTest.class.getResource("config.properties").openStream();
//调用方法Object bean=new BeanFactory(is).getBean("xxx");System.out.println(bean.getClass().getName());}}
#BeanFactory#
这里要判断一下这个对象是否在ProxyFactoryBean中,如果不在直接不执行if,返回对象,如果是一个代理,那就要执行if
package day13;import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class BeanFactory {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub}Properties prop=new Properties();public BeanFactory(InputStream is) throws Exception{prop.load(is);}public Object getBean(String name) throws Exception{String className=prop.getProperty(name);System.out.println("helo"+className);Object obj=Class.forName(className).newInstance();
//这里要判断一下这个对象是否在ProxyFactoryBean中,如果不在直接不执行if,返回对象,如果是一个代理,那就要执行ifif(obj instanceof ProxyFactoryBean){ Object proxy=null;ProxyFactoryBean proxyfactoryBean=(ProxyFactoryBean)obj;Object target=Class.forName(prop.getProperty(name+".target")).newInstance();Advise advise=(Advise) Class.forName(prop.getProperty(name+".advise")).newInstance();proxyfactoryBean.setTarget(target);proxyfactoryBean.setAdvise(advise); proxy=((ProxyFactoryBean)obj).getProxy(); return proxy;}return obj;}}
#ProxyFactoryBean#
我老疑惑怎么不要构造方法把那两个参数target,advise传进来,原来他们都是静态的成员变量。
package day13;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Collection;public class ProxyFactoryBean {/** * @param args */private static Object target;private static Advise advise;public static void main(String[] args) {// TODO Auto-generated method stub}public static Object getProxy() {Collection c1=(Collection) Proxy.newProxyInstance(/*Collection.class.getClassLoader()*/target.getClass().getClassLoader(),/*new Class[]{Collection.class}*/target.getClass().getInterfaces(),new InvocationHandler(){ public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stub//其实我们是把以前写这里的代码,都抽出来,写到advise里面去了advise.beforeMethod(method); //Long startTime=System.currentTimeMillis();Object val= method.invoke(target,args);advise.afterMethod(method);//Long endTime=System.currentTimeMillis(); return val; } });return c1;}public Object getTarget() {return target;}public void setTarget(Object target) {this.target = target;}public static Advise getAdvise() {return advise;}public static void setAdvise(Advise advise) {ProxyFactoryBean.advise = advise;}}
----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------
0 0
- 黑马程序员_java高级篇代理Day14(下)
- 黑马程序员_java高级篇代理Day14(上)
- 黑马程序员_java基础day14
- 黑马程序员_java代理
- 黑马程序员_java高级篇反射Day10
- 黑马程序员_java高级篇反射Day11
- 黑马程序员_JAVA高级属性
- 黑马程序员_java代理模式
- 黑马程序员_Java动态代理
- 黑马程序员_java动态代理
- 黑马程序员_java高级篇网络编程UDP实战Day7(下)
- 黑马程序员_java高级篇网络编程TCP实战Day8(下)
- 黑马程序员——day14事务和动态代理
- 黑马程序员_java高级篇网络编程基础概念Day7
- 黑马程序员_java高级篇初识框架+Beanutil Day12
- 黑马程序员-day14集合
- 黑马程序员_java多线程下
- 黑马程序员_JAVA集合(下)
- 数据仓库定义
- Tomcat 的 SSL 配置
- Multi Range Read (MRR) in MySQL 5.6 and MariaDB 5.5
- CSS样式下border的几种线型
- hdu 2045
- 黑马程序员_java高级篇代理Day14(下)
- 昨天过得真好
- CSS截取字段,让过长的字段结尾变成省略号(IE有效)
- No projects are found to import 问题如何解决
- 电商们的数据挖掘战略
- 交换机基础
- PHP post提交xml 以及获取post过来的xml数据
- SoC芯片是什么
- 字符串显示标记