黑马程序员---java学习笔记之java加强(三)

来源:互联网 发布:mac 用鼠标吗 编辑:程序博客网 时间:2024/06/09 23:00

1、类中静态方法不能使用类上的泛型限定。

2、通过反射的方法获取某方法的泛型参数的泛型类型。

import java.lang.reflect.Method;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.Date;import java.util.Vector;public class GenericDemo2 {public static void main(String[] args) throws Exception {Vector<Date> v = new Vector<Date>();Method method =GenericDemo2.class.getMethod("applyVector", Vector.class);Type[] type =method.getGenericParameterTypes();ParameterizedType t =(ParameterizedType)type[0];System.out.println(t.getRawType());System.out.println(t.getActualTypeArguments()[0]);}public static void applyVector(Vector<Date> v){}}

3、java提供的三个类加载器

        a):BootStrap(非java类),负责加载的类路径是:jre/lib/rt.jar

        b):ExtClassLoader,负责加载的类路径是:jre/lib/ext/*.jar

        c):AppClassLoader,负责加载的类路径是:classpath下的类


4、

System.out.println(ClassLoaderDemo.class.getClassLoader().getClass().getName());//打印结果是:sun.misc.Launcher$AppClassLoaderSystem.out.println(System.class.getClassLoader());//打印结果为null,因为//家在该类的加载器是BootStrap//下面通过代码来表明BootStrap、ExtClassLoader、AppClassLoader三个加载器之间的关系ClassLoader cl = ClassLoaderDemo.class.getClassLoader();while( cl != null ){System.out.println(cl.getClass().getName());//打印结果分别是:sun.misc.Launcher$AppClassLoader//sun.misc.Launcher$ExtClassLoadercl = cl.getParent();}//由打印结果可知,AppClassLoader的父加载器是ExtClassLoader,ExtClassLoader//的父加载器是BootStrap
5、每个类加载器加载类时,先委托给其上级类加载器。这称为类加载器的委托机制。

6、类加载器的加密和解密

7、java servlet中的一个类加载器的问题

8、代理类,面向方面的编程(AOP)。

        业务交叉,面向方面编程,代理能够很好的解决这个问题。

        动态代理。

        CGLIB动态地生成没有借口的类的子类。

9、创建Collection的代理类的示例

import java.lang.reflect.Constructor;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Collection;public class ProxyDemo {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubClass proxyClass = Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);Constructor[] cons = proxyClass.getConstructors();for( Constructor con : cons ){String conName = con.getName();StringBuilder sBuilder = new StringBuilder(conName);sBuilder.append('(');Class[] prames = con.getParameterTypes();for( Class prame : prames ){sBuilder.append(prame.getName()+",");}if( (prames != null) && (prames.length != 0) )sBuilder.deleteCharAt(sBuilder.length()-1);sBuilder.append(')');System.out.println(sBuilder);}Method[] methods = proxyClass.getMethods();for( Method method : methods ){String name = method.getName();StringBuilder sBuilder = new StringBuilder(name);sBuilder.append('(');Class[] methodPrames = method.getParameterTypes();for( Class methodPrame : methodPrames ){sBuilder.append(methodPrame.getName()+",");}if( methodPrames != null  &&  methodPrames.length!= 0)sBuilder.deleteCharAt(sBuilder.length()-1);sBuilder.append(')');System.out.println(sBuilder);}}}
10、构造动态类对象的第一种方法:获取动态类字节码实例对象,之后获取该字节码对象的构造方法对象,然后使用该构造方法对象构造动态类的对象。

Class proxyClass = Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);Collection coll = (Collection)proxyClass.getConstructor(InvocationHandler.class).newInstance(new InvocationHandler(){@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubreturn null;}} );
第二种方法,

Collection coll = (Collection)Proxy.newProxyInstance(Collection.class.getClass().getClassLoader(),new Class[]{Collection.class}, new InvocationHandler(){@Overridepublic Object invoke(Object proxy, Method method,Object[] args) throws Throwable {// TODO Auto-generated method stubreturn null;}});
11、动态类的一种使用:

Collection coll = (Collection)Proxy.newProxyInstance(Collection.class.getClass().getClassLoader(),new Class[]{Collection.class}, new InvocationHandler(){ArrayList target = new ArrayList();@Overridepublic Object invoke(Object proxy, Method method,Object[] args) throws Throwable {long startTime = System.currentTimeMillis();Object retVal = method.invoke(target, args);long endTime = System.currentTimeMillis();System.out.println(endTime - startTime);return retVal;}});coll.add("abc");coll.add("123");coll.add("xyz");System.out.println(coll.size());

0 0
原创粉丝点击