Java反射机制(3)

来源:互联网 发布:halcon二维码识别优化 编辑:程序博客网 时间:2024/06/06 19:35
反射操作范型
Java采用范型擦除的机制来引入范型。java中的范型仅仅是给编译器Javac使用,确保数据的安全性和免去强制类型转换的麻烦,但是一旦编译完成,所有的和范型有关的类型全部擦除。


为了通过反射操作这些类型以迎合实际开发的需要,Java新增了ParameterizedType,GenericArrayType,TypeVariable和WildcardType几种类型来代表不能被归一到Class类中的类型,但是又和原始类型齐名的类型
ParameterizedType:表示一种参数化的类型,比如Collection<String>
GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型
TypeVariable:是各种类型变量的公共父接口
WildcardType:代表一种通配符类型表达式,比如?,? extends Number,? super Integer






动态编译机制:
两种方法
第一种:通过Runtime调用javac,启动新的进程去操作
Runtime run=Runtime.getRuntime();
Process process=run.exec("java -cp c:/hello.java");


例如:
Runtime runtime=Runtime.getRuntime();
Process process=runtime.exec("javac c:/users/lenovo/desktop/Hello.java");


第二种:通过JavaCompiler动态编译
JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();
int result=compiler.run(arg1,arg2,arg3,arg4)
arg1:为java编译器提供参数
arg2:得到java编译器输出信息
arg3:接收编译器错误信息
arg4:可变参数(String数组)能传入一个或多个java文件
返回值:0表示编译成功,非0表示编译失败


例如:
JavaCompiler javaCompiler= ToolProvider.getSystemJavaCompiler();
javaCompiler.run(null,null,null,"c:/users/lenovo/desktop/Hello.java");


动态运行编译好的类:
第一种:通过Runtime.getRuntime()运行启动新的进程运行
Runtime runtime=Runtime.getRuntime();
Process process=run.exec("java -cp dir className")
例如:
Runtime run=Runtime.getRuntime();
Process process1=runtime.exec("java -cp c:/users/lenovo/desktop Hello");


第二种:通过反射运行编译好的类
URL[] urls={new URL("file:"+dir)};
URLClassLoader loader=new URLClassLoader(urls);
Class c=loader.loadClass(classFile);

c.getDeclaredMethod("main",String[].class).invoke(null,(Object)new String[]{});


ORM(Object Relationship Mapping)基本思想:
表结构跟类对应:表中的字段和类的属性对应;表中的记录跟对象对应;
让javabean的属性名和类型尽量和数据库保持一致
一条记录对应一个对象,将这些查询对象放到容器中


将表中的一条记录封装到Object数组中
将表中的一条记录封装到Map中
将表中的一条记录封装到javabean中

0 0