框架开发原理/类加载器加载配置文件
来源:互联网 发布:网站域名到期怎么回事 编辑:程序博客网 时间:2024/05/17 17:39
Properties可以将文件读到内存中,同时也可以将内存中的文件保存到文件,详见http://blog.csdn.net/hjh200507609/article/details/50315855
</pre><pre name="code" class="java">package com.hjh.test;import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.io.InputStream;import java.lang.reflect.Method;import java.util.Properties;public class Test {/** * @param args */public static void main(String[] args) throws Exception{System.out.println(TrafficLamp.RED.nextLamp().getTime());//通过类加载器加载项目下的配置文件InputStream inputStream = TrafficLamp.class.getClassLoader().getResourceAsStream("com/hjh/test/config.properties");//TrafficLamp.class.getResourceAsStream("config.properties");相对于TrafficLamp文件夹,作用等同于上Properties properties = new Properties();properties.load(inputStream);//取得动态的名称String className = properties.getProperty("className");System.out.println(className);//实例化无参构造函数,如果知道具体类型,可强转调用方法Object object = Class.forName(className).newInstance();String propertyName = "time";//对象属性的名称PropertyDescriptor descriptor = new PropertyDescriptor(propertyName, TrafficLamp.class);//获取某类的某属性的描述符Method sMethod = descriptor.getReadMethod();//取得属性的读方法即get方法,同样可取得set方法Object ssssObject = sMethod.invoke(TrafficLamp.RED);//执行对象的方法System.out.println(ssssObject);//BeanInfo beanInfo = Introspector.getBeanInfo(TrafficLamp.class);//将某类看做JavaBean看待//beanInfo.getPropertyDescriptors();//得到所有的属性描述符,但需要遍历才能找到需要的属性执行,效率不如上;}/** * 带有抽象方法和构造函数的枚举 * @author hjh * */public enum TrafficLamp{RED(30){@Overridepublic TrafficLamp nextLamp() {return GREEN;}},GREEN(15){@Overridepublic TrafficLamp nextLamp() {return YELLOW;}},YELLOW(3){@Overridepublic TrafficLamp nextLamp() {return RED;}};public abstract TrafficLamp nextLamp();private int time;private TrafficLamp(int time){setTime(time);}public int getTime() {return time;}public void setTime(int time) {this.time = time;}}}
类加载器BootStrap(Java虚拟机加载器,加载其他的类加载器,加载rt.jar,属于最顶层的类加载器)==> ExtClassLoader(ext.jar中类加载器) ==>AppClassLoader(CLASSPATH目录下的类加载器),按父子关系呈现;
每个类加载器必须有个父类;属于一个委托加载机制,委托父类加载器执行,如果最顶层无法加载,抛异常;
自定义类加载器:
1.继承ClassLoader;
2.loadClass()父类处理的方法,因此子类不需要重写,始终执行父类的此方法就可以;findClass()(自己处理,每个子类处理方法不一样),因此可以重写;
3.defineClass()返回class的字节码,父类已经实现,直接在findClass方法中调用即可;
package com.hjh.test;import java.io.ByteArrayOutputStream;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 ClassLoaderTest {/** * @param args */public static void main(String[] args) throws Exception{new ClassLoaderTest().proxy();}/** * 自定义类加载器 * @author Administrator * */public class MyClassLoader extends ClassLoader{@Overrideprotected Class<?> findClass(String arg0) throws ClassNotFoundException {ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();defineClass(arrayOutputStream.toByteArray(), 0,arrayOutputStream.toByteArray().length);return super.findClass(arg0);}}/** * 动态类测试 * @throws Exception */public void proxy() throws Exception{Class clazz = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);//参数表示对应的接口和接口的类加载器//生成类的实例通过带参的构造函数Collection collection = (Collection) clazz.getConstructor(InvocationHandler.class).newInstance(new InvocationHandler(){@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {return 2;}});collection.clear();collection.size();//返回值为InvocationHandler接口invoke()方法的返回值System.out.println(collection.size());Collection collection2 = (Collection) Proxy.newProxyInstance(Collection.class.getClassLoader(), new Class[]{Collection.class},new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {ArrayList arrayList = new ArrayList<>();//执行方法的对象Object object = method.invoke(arrayList, args);return object;}});collection2.add(1);collection2.add(2);collection2.size();System.out.println(collection2.size());}class MyInvokeHandler implements InvocationHandler{private Object tartgetObject;public MyInvokeHandler(){}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {return null;}}
<span style="white-space:pre"></span><pre name="code" class="java">/** * 动态代理类 * @param target 目标对象 * @param work 实现接口的类 * @return */public Object getProxy(final Object target,final Work work){Object object = Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {work.beginWork();Object object = method.invoke(target, args);work.endWork();return object;}});return object;}public interface Work{void beginWork();void endWork();}
}
0 0
- 框架开发原理/类加载器加载配置文件
- 类加载器classLoader加载配置文件多种方法,框架原理--反射
- 利用反射模拟框架 类加载器 加载配置文件
- 小框架:用类加载器加载配置文件
- 自定义框架-加载配置文件
- java 高新技术【6】 反射开发框架以及用 类加载器 管理资源和配置文件
- java 高新技术【6】 反射开发框架以及用 类加载器 管理资源和配置文件
- 使用类加载器加载配置文件
- 用类加载器加载配置文件
- 用类加载器加载配置文件
- 使用类加载器加载配置文件
- 利用Java反射机制模拟框架利用类加载器加载配置文件
- springBoot配置文件加载原理探究
- 类加载器原理
- 类加载器原理
- java开发中加载配置文件
- 通过类加载配置文件
- 配置文件加载工具类
- IOS Apps 开发(Swift)(7)——Define Your Data Model
- 解决安装ECshop时PHP版本大于5.2时的问题
- 《数据结构与算法分析(c描述》—— 快速排序
- 整数转换成字符串
- 系统自动布局
- 框架开发原理/类加载器加载配置文件
- 一个前端工程师的面试经历
- 关于Jpgraph 的中文乱码问题
- spark运算结果写入hbase及优化
- Python中的*args和**kwargs
- 15集中器模块ISP烧写
- 进程内COM与进程外COM
- 给 iOS 开发者的 Sketch 入门教程
- iPad 应用