黑马程序员---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//的父加载器是BootStrap5、每个类加载器加载类时,先委托给其上级类加载器。这称为类加载器的委托机制。
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
- 黑马程序员---java学习笔记之java加强(三)
- 黑马程序员---java学习笔记之java加强(一)
- 黑马程序员---java学习笔记之java基础加强二
- 黑马程序员笔记:Java基础加强之二---枚举
- 黑马程序员--Java基础加强(三)
- 黑马程序员-java基础加强(三)
- 黑马程序员--Java基础加强学习笔记之重载和覆写、可变参数、枚举
- 黑马程序员--Java基础加强学习笔记之Class类、反射(Reflect)
- 黑马程序员—Java基础加强学习笔记之泛型
- 黑马程序员—Java基础加强学习笔记之枚举&反射
- 黑马程序员-Java学习笔记之IO流(三)
- 黑马程序员-java学习基础加强之泛型
- 黑马程序员-java学习基础加强之IO流
- 黑马程序员-java学习基础加强之网络编程
- 黑马程序员:java加强笔记(上)
- 黑马程序员:java加强笔记(下)
- 黑马程序员 Java基础加强笔记
- 黑马程序员笔记:Java基础加强之一
- poj3273
- 1-12以每行一个单词的形式打印输入
- hdu 1159 && poj 1458 Common Subsequence (LCS)
- 【项目开发】点击事件,报错event.returnValue is deprecated.
- javaSE-泛型
- 黑马程序员---java学习笔记之java加强(三)
- CSS样式常用兼容属性之日积月累
- xcode5home键问题
- TinyOS 同步与异步处理学习心得
- C# 利用QRCode生成二维码图片
- 编程中内存限制问题
- Centos6 下安装glibc-debuginfo
- java堆 、栈学习(深刻理解String s=new String("xoxo")和String s=" xxoo"的区别)
- Elasticsearch